繁体   English   中英

C语言scanf复制多余的字符串

[英]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 ,在xhello\\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 ,您在yworld\\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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM