[英]C language scanf copies extra string
#include <stdio.h>
#include <string.h>
int main()
{
char x[5];
char y[10];
scanf("%s",x);
scanf("%s",y);
printf("%s %s",x,y);
}
我在终端中输入了“ helloworld world”,但结果为“ helloworld world”。 我在做错什么吗?
当你声明
char x[5];
char y[10];
在内存中,您将看到以下内容:
1 1 1 1 1
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4
+---------+-------------------+
|. . . . .|. . . . . . . . . .|
+---------+-------------------+
^ ^
\-- x \-- y
在第一个scanf
,在x
写hello\\0
1 1 1 1 1
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4
+---------+-------------------+
|h e l l o|0 . . . . . . . . .|
+---------+-------------------+
在第二个scanf
,您在y
写world\\0
1 1 1 1 1
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4
+---------+-------------------+
|h e l l o|w o r l d 0 . . . .|
+---------+-------------------+
当您键入printf("%s", x);
您要求键入从x
到第一个\\0
,因此将打印出"helloworld"
。
当您键入printf("%s", y);
您要求键入从y
到第一个\\0
,因此将打印出"world"
。
注意:
内存排列方式不是确定性的,您应该获得所有其他结果,甚至崩溃...
您可以在此处找到使用scanf
的好教程: http : //sekrit.de/webdocs/c/beginners-guide-away-from-scanf.html
在没有WIDTH的情况下,绝对不要使用"%s"
格式说明符来告诉scanf()
它可以将多少个字符放入参数所指向的内存中,永远不要,永远不要。
char str[5];
scanf("%4s", str);
C中的字符串以空字节终止。 因此,字符串“ hello”实际上需要6个字节来存储:“ hello”中的字母5个,空字节1个。
变量x
只有5个字节宽,因此它不足以存储字符串“ hello”。 结果,尝试将此字符串写入x
超出数组末尾。 这会调用未定义的行为 ,在这种情况下,这表现为写入相邻变量。
增加x
的大小以防止数组溢出。 您还应该在格式说明符中使用字段宽度来指定要读取的最大字符数:
char x[6];
char y[10];
scanf("%5s",x);
scanf("%9s",y);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.