C中的交互式随机程序

时间:2015-10-02 00:26:21

标签: c arrays pointers random

我对这个程序的目标是将用户输入合并到一种交互式/随机化的故事中,但我不确定我应该如何从用户那里获得适合*ptrDescription之间的输入,{ {1}},*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++)

输出中的句子后面有很多奇怪的字符,比如日文字符和东西。不过,我不确定他们为什么会在那里。这就是它的样子:

“输入您的名字:Justin

输入您的年龄:20岁 傲慢的20岁的贾斯汀故意无视最强大的巫师,他们正朝着他们的方向前进。汽油$0HβHζ(テフフフフフフフフフフフH H

任何人都知道如何摆脱它们?

1 个答案:

答案 0 :(得分:0)

如果您已有姓名和年龄,只需将其插入sentence中的正确位置即可,对吧?因此strcat(sentence, name)适用于名称。 age有点棘手,因为您必须首先格式化数字,strcat不会为您做这件事。一种解决方案是使用sprintf(buf, "%d", age),然后连接buf(这是一个你必须声明的临时字符数组)。

每次使用C语言中的字符串时,都必须担心目标缓冲区中有足够的空间。在输入和输出期间,您的程序可能会耗尽空间。对于输出,我会完全摆脱sentence;因为你最终写到stdout,所以我会printf("%s", [part])每个部分。对于阅读,scanf支持在格式字符串中添加长度参数。

如果您使用* printf函数之一,则必须注意以下两点:

  1. 您传递的参数对于您使用的格式字符串是正确的
  2. 您的缓冲区最终以空终止
  3. 你当前的问题是#1 - 你的格式字符串承诺遵循7个参数,但你只提供6. snprintf抓取&#34;随机&#34;堆栈中的第7个值,将其解释为char指针,并将它在那里找到的任何内容复制到sentence。如果你的格式字符串承诺了一个char指针,但你在给定的位置放置了一个int,你可能会看到类似的问题。在这种情况下,格式字符串是常量,因此智能编译器可以验证您的格式字符串是否与后续参数匹配。你会想养成严肃对待编译器警告的习惯,而不是忽略它们。

    如果你的句子比你的句子缓冲区大,那么第二点可能是一个问题。如果没有空终止符的空间,则不会应用。您可以检查snprintf的返回值,或者您可以防御性地始终将0写入最后一个数组位置。