为什么printf只打印通过scanf读取输入的字符数组的第一个字符

时间:2017-03-17 14:46:42

标签: c

此代码应该通过scanf读取输入字符串并将输入字符串存储在此处声明为msg []的数组中,然后打印这些输入字符串,但是当我运行代码时,所有打印的字符串只是第一个字符。串。它看起来很简单,但我无法解决它。

如果我输入i do,则只会报告i

#include <stdio.h>

int main()
{
    char msg[5]; 
    printf("enter the message: ");
    scanf("%s",msg);           
    printf("entered msg is: %s", msg); 
}

2 个答案:

答案 0 :(得分:4)

答案隐藏在评论中。 OP表示if i give input "i do" it prints only 'i'

scanf仅读取第一个空格(i中的i do)。

如果输入4个字符,则打印4个字符。

请修改您的问题,以便为将来的搜索者提供此信息。

答案 1 :(得分:0)

%s转换说明符告诉scanf跳过任何前导空格,然后读取(但不包括)下一个空白字符。因此,当您输入"i do"时,%s转化说明符只会读取"i"

如果要使用空格读取字符串,则必须使用其他方法。您可以使用%[转换说明符,如下所示:

scanf( "%[^\n]", msg );

将读取所有内容(包括前导空白字符),直到它看到'\n'换行符并将其存储到msg。不幸的是,这个(以及上面的%s说明符)会让您对缓冲区溢出开放 - 如果您的用户输入的字符串长度大于msg,则scanf会愉快地写出这些额外的字符在msg缓冲区之后的内存中,导致各种各样的混乱。为防止这种情况发生,您可以在转换规范中使用字段宽度,如下所示:

scanf( "%4[^\n]", msg );

这告诉scanfmsg中读取不超过4个字符。不幸的是,这个宽度必须是硬编码的 - 你不能以printf的方式将它作为参数传递。

IMO,更好的方法是使用fgets

fgets( msg, sizeof msg, stdin );