这是我应该提交的作业的一部分,该程序应该采用2个输入,一个包含4个字母的名称和一个包含5个字母的城市,然后将它们分配到该句子中。问题是第一个单词没有正确输出,就像我输入john所有我得到的是'r'而不是单词。我是新手,可能还有其他错误,但我想解决这个问题。非常感谢。 :升
#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;
}
当我把John和Denver输出时“r害怕他从丹佛走到罗马的飞机”
答案 0 :(得分:1)
Aham,所以这是一个缓冲区溢出。你应该做的是:
予。分配两个合理长缓冲区。 4和5只是让我哭泣。 <{1}}中的LINE_MAX
宏可能很有用。
II。使用安全功能可以指定缓冲区的大小。例如,<limits.h>
是输入文本行的绝佳功能。使用它还有一个好处,它实际上总是读取整行(如果传递给它的缓冲区足够大)。 fgets()
需要先处理scanf()
转换说明符,然后才能让它接受空格和内容。
%s
答案 1 :(得分:0)
#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;
}
解决方案:确保字符数组足够大以便输入。
答案 2 :(得分:-1)
scanf
是一个不安全的函数,因为它将从其输入流中获取数据并将其复制到您提供的缓冲区的末尾(如果它不够大)。此外,它会在复制的字符串末尾放置一个nul
终止字符。
在您的示例中,John
至少需要5个字符,Denver
至少需要7个字符,因为您必须考虑终止字符。
你应该考虑为两个字符串使用更大的缓冲区,或者作为更好的选择,编写自己的函数,使用缓冲区来存储字符串,然后将其复制到最终目标缓冲区(假设长度足够,否则截断)
看看这个答案:How to prevent scanf causing a buffer overflow in C?,您的问题有一些常见的解决方法。