C 第一个字符串输出未显示
这是我应该提交的作业的一部分,这个程序应该接受2个输入,一个名字包含4个字母,一个城市包含5个字母,然后再把它们分到那个句子中。问题是第一个单词没有正确输出,比如如果我键入john,我得到的是“r”而不是单词。我是新手,可能还有其他错误,但我想修正这个错误。非常感谢您的帮助lC 第一个字符串输出未显示,c,string,C,String,这是我应该提交的作业的一部分,这个程序应该接受2个输入,一个名字包含4个字母,一个城市包含5个字母,然后再把它们分到那个句子中。问题是第一个单词没有正确输出,比如如果我键入john,我得到的是“r”而不是单词。我是新手,可能还有其他错误,但我想修正这个错误。非常感谢您的帮助l #include <stdio.h> int main(int argc, char **argv) { char name1[4]; char city1[5]; printf("\nEnter fo
#include <stdio.h>
int main(int argc, char **argv)
{
char name1[4];
char city1[5];
printf("\nEnter four letter name:\n");
scanf("%s", name1);
printf("\nEnter five letter city:\n");
scanf("%s", city1);
printf("%s was afraid of the airplane, he walked from %s to Romaine.", name1, city1);
return 0;
}
#包括
int main(int argc,字符**argv)
{
字符名称1[4];
char city1[5];
printf(“\n输入四个字母的名称:\n”);
scanf(“%s”,名称1);
printf(“\n输入五个字母的城市:\n”);
scanf(“%s”,城市1);
printf(“%s害怕飞机,他从%s走到了Romaine。”,名字1,城市1);
返回0;
}
当我输入John和Denver时,它的输出“r害怕他从Denver走到Romaine的飞机”
scanf
是一个不安全的函数,因为它将从输入流中提取数据,并在缓冲区不够大的情况下将其复制到缓冲区的末尾。此外,它将在复制的字符串末尾放置一个nul
终止字符
在您的示例中,John
至少需要5个字符,而Denver
至少需要7个字符,因为您必须考虑终止字符
您应该考虑为两个字符串使用更大的缓冲区,或者作为更好的选择,编写自己的函数,该函数使用缓冲区来存储字符串,然后将其复制到最终的目标缓冲区(假设长度足够,否则截断)。 看看这个答案:,对于您的问题,有一些常见的解决方法。
#包括
#include <stdio.h>
int main(int argc, char **argv)
{
char name1[8];
char city1[8];
printf("\nEnter four letter name:\n");
scanf("%s", name1);
printf("\nEnter five letter city:\n");
scanf("%s", city1);
printf("%s was afraid of the airplane, he walked from %s to Romaine.", name1, city1);
return 0;
}
int main(int argc,字符**argv)
{
字符名称1[8];
char city1[8];
printf(“\n输入四个字母的名称:\n”);
scanf(“%s”,名称1);
printf(“\n输入五个字母的城市:\n”);
scanf(“%s”,城市1);
printf(“%s害怕飞机,他从%s走到了Romaine。”,名字1,城市1);
返回0;
}
解决方案:确保字符数组足够大以供输入。Aham,因此这是缓冲区溢出。你应该做的是: I.分配两个合理长度的缓冲区。4和5只会让我哭泣。在
中有一个行\u MAX
宏,它可能很有用
二,。使用一个可以指定缓冲区大小的安全函数。例如,fgets()。使用它还有一个好处,就是它实际上总是读取整行(如果传递给它的缓冲区足够大)scanf()
需要对%s
转换说明符进行一些修改,然后才能使其接受空白和其他内容
char name[LINE_MAX];
char city[LINE_MAX];
fgets(name, sizeof name, stdin);
fgets(city, sizeof city, stdin);
charcity1[5]代码>,但是“丹佛”
在0-终止符之前有6个字母,因此至少需要一个字符[7]
。未定义的行为,在数组边界外写入。显然,它重写了name1
的开头。字符串的常见错误:C中的字符串由字符串的字符和附加的终止字符组成\0
,因此John需要另存为John\0
(char[5+]
)。谢谢你,你是个救命恩人!“编写您自己的函数”-不需要,我们可以使用fgets()
。8也不是更好。而且scanf()
仍然是不安全的(还有其他缺点)。@H2CO3不,这不是更好,但我清楚地告诉他,要让他的字符数组足够大,以满足所需的输入,就像我对他的例子所做的那样。他要的是一个单词作为输入,而不是整行,所以在这个答案中空格是无用的。@DavidOtano仍然,scanf()。他最好坚持使用fgets()
(搜索一下堆栈溢出,你会看到更多的例子,不仅仅是我推荐它。)我理解你的担忧,我同意这是一个更安全的选择。但是他仍然不需要一个完整的行。@DavidOtano好的,那么他将免费获得一些额外的功能,因为我觉得今天是恩人。顺便说一句,line_MAX只是一个POSIX宏。