Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 第一个字符串输出未显示_C_String - Fatal编程技术网

C 第一个字符串输出未显示

C 第一个字符串输出未显示,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

这是我应该提交的作业的一部分,这个程序应该接受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;
}
#包括
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宏。