-1

这是我应该提交的作业的一部分,该程序应该接受 2 个输入,一个包含 4 个字母的名称和一个包含 5 个字母的城市,然后将它们放在该句子中。问题是第一个单词没有正确输出,就像我输入 john 一样,我得到的只是 'r' 而不是单词。我是新手,可能还有其他错误,但我想修复这个。非常感谢帮助。:l

#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;
}

当我输入约翰和丹佛时,它会输出“r 害怕他从丹佛步行到罗曼的飞机”

4

3 回答 3

1

啊哈,所以这是缓冲区溢出。你应该做的是:

I. 分配两个相当长的缓冲区。4和5让我哭了。有一个LINE_MAX<limits.h>可能有用。

二、使用可让您指定缓冲区大小的安全函数。例如,fgets()是输入一行文本的绝佳功能。使用它还有一个好处是它确实总是读取整行(如果传递给它的缓冲区足够大)。scanf()需要先弄乱%s转换说明符,然后才能使其接受空格和其他内容。

char name[LINE_MAX];
char city[LINE_MAX];
fgets(name, sizeof name, stdin);
fgets(city, sizeof city, stdin);
于 2013-07-13T12:17:59.197 回答
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;
}

解决方案:确保字符数组对于输入来说足够大。

于 2013-07-13T12:04:43.097 回答
-1

scanf是一个不安全的函数,因为如果它不够大,它会从输入流中获取数据并将其复制到您提供的缓冲区的末尾。此外,它将nul在复制字符串的末尾放置一个终止字符。

在您的示例John中,至少需要 5 个字符,而Denver至少需要 7 个字符,因为您必须考虑终止字符。

您应该考虑为两个字符串使用更大的缓冲区,或者作为更好的选择,编写自己的函数,该函数使用缓冲区来存储字符串,然后将其复制到最终目标缓冲区(假设长度足够,否则截断)。

看看这个答案:如何防止 scanf 在 C 中导致缓冲区溢出?,有一些常见的解决方法可以解决您的问题。

于 2013-07-13T12:02:21.893 回答