我对这个程序的目标是将用户输入合并到一种交互式/随机化的故事中,但我不确定我应该如何从用户那里获得适合*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
任何人都知道如何摆脱它们?
答案 0 :(得分:0)
如果您已有姓名和年龄,只需将其插入sentence
中的正确位置即可,对吧?因此strcat(sentence, name)
适用于名称。 age
有点棘手,因为您必须首先格式化数字,strcat
不会为您做这件事。一种解决方案是使用sprintf(buf, "%d", age)
,然后连接buf
(这是一个你必须声明的临时字符数组)。
每次使用C语言中的字符串时,都必须担心目标缓冲区中有足够的空间。在输入和输出期间,您的程序可能会耗尽空间。对于输出,我会完全摆脱sentence
;因为你最终写到stdout,所以我会printf("%s", [part])
每个部分。对于阅读,scanf
支持在格式字符串中添加长度参数。
如果您使用* printf函数之一,则必须注意以下两点:
你当前的问题是#1 - 你的格式字符串承诺遵循7个参数,但你只提供6. snprintf
抓取&#34;随机&#34;堆栈中的第7个值,将其解释为char指针,并将它在那里找到的任何内容复制到sentence
。如果你的格式字符串承诺了一个char指针,但你在给定的位置放置了一个int,你可能会看到类似的问题。在这种情况下,格式字符串是常量,因此智能编译器可以验证您的格式字符串是否与后续参数匹配。你会想养成严肃对待编译器警告的习惯,而不是忽略它们。
如果你的句子比你的句子缓冲区大,那么第二点可能是一个问题。如果没有空终止符的空间,则不会应用。您可以检查snprintf
的返回值,或者您可以防御性地始终将0写入最后一个数组位置。