我的这个程序的目标是将用户的输入合并到一种交互式/随机的故事中,但我不确定如何从用户那里获取输入以适应 *ptrDescription
之间的输入。 , *ptrBeginning
, *ptrMiddle
,和*ptrEnd
。任何帮助将非常非常感谢!
#include <stdio.h>
#include<stdlib.h>
#include<time.h>
#include <string.h>
#include <ctype.h>
int main(void){
int i;
char name[20];
char color[20];
int age;
char sentence[1];
//array of pointers to char arrays
char *ptrDescription[]={"the painfully handsome","the one and only","who seemed much older than"};
char *ptrBeginning[]={"was blissfully ignoring","could clearly see","had no idea"};
char *ptrMiddle[]={"the huge truck","the falling meteor","the bucket of milk","the mailman","the most powerful wizard"};
char *ptrEnd[]={"that was barreling toward them.","on the horizon."};
srand(time(NULL));
printf("Enter your first name: ");
scanf("%s", &name);
printf("\nEnter your age: ");
scanf("%d", &age);
printf("\nEnter your favorite color: ");
scanf("%s", &color);
for (i = 0; i < 1; i++)
{
//strcpy(sentence,ptrDescription[rand()%3]);
//strcat(sentence," ");
//strcat(sentence,ptrBeginning[rand()%3]);
//strcat(sentence," ");
//strcat(sentence,ptrMiddle[rand()%5]);
//strcat(sentence," ");
//strcat(sentence,ptrEnd[rand()%2]);
//strcat(sentence,".");
//sentence[0]=toupper(sentence[0]);
puts(sentence);
}
getch();
return 0;
}
编辑:
我编辑了代码的一部分,以便直接遵循 for (i = 0; i < 1; i++)
现在看起来像这样:
snprintf(sentence, sizeof sentence,"%s, %s %d year old, %s %s %s %s", name, ptrDescription[rand()%3], age,ptrBeginning[rand()%3], ptrMiddle[rand()%5], ptrEnd[rand()%2]);
输出中的句子后面有大量奇怪的字符,比如日语字符之类的。但我不确定他们为什么在那里。这就是它的样子:
“输入您的名字:贾斯汀
输入您的年龄:20 贾斯汀,这个傲慢的二十岁少年,故意无视向他们冲来的最强大的巫师。汽$0HβHze(テフフフフフフフフフフフフフH・(DキHH広$0陏&・汽$0タHze(テフフフフフフフフフフフフフフフH WH・ H栉H・t9HνHテ<"
有人知道我怎样才能摆脱它们吗?
最佳答案
如果您已经有了姓名和年龄,只需将它们插入到句子
中的正确位置即可,对吗?所以 strcat(sentence, name)
适用于 name。 age
有点棘手,因为您必须先格式化数字,而 strcat
不会为您做这件事。一种解决方案是使用 sprintf(buf, "%d",age) ,然后连接 buf (这是您必须声明的临时字符数组)。
任何时候在 C 中处理字符串时,都必须关心目标缓冲区中有足够的空间。您的程序在输入和输出期间都可能会耗尽空间。对于输出,我会完全删除sentence
;因为您最终只是写入标准输出,所以我会在您进行过程中打印每个部分。对于读取,scanf
支持向格式字符串添加长度参数。
如果您使用 *printf 函数之一,则必须注意两件事:
- 您传递的参数对于您使用的格式字符串是正确的
- 您的缓冲区最终以 null 终止
您当前的问题在于#1 - 您的格式字符串 promise 遵循 7 个参数,但您只提供 6 个。snprintf
从堆栈中获取“随机”第 7 个值,将其解释为 char指针,并将其找到的任何内容复制到sentence
。如果您的格式字符串 promise 使用 char 指针,但您在给定位置放置了 int,您可能会遇到类似的问题。在这种情况下,格式字符串是一个常量,因此智能编译器可以验证您的格式字符串是否与后续参数匹配。您需要养成认真对待编译器警告而不是忽略它们的习惯。
如果您的句子最终大于句子缓冲区,那么第二点可能会成为问题。如果没有空终止符的空间,则不会应用空终止符。您可以检查 snprintf
的返回值,或者您可以防御性地始终将 0 写入到最后一个数组位置。
关于c - C 语言的交互式随机程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32898790/