此代码应该通过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);
}
答案 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 );
这告诉scanf
在msg
中读取不超过4个字符。不幸的是,这个宽度必须是硬编码的 - 你不能以printf
的方式将它作为参数传递。
IMO,更好的方法是使用fgets
:
fgets( msg, sizeof msg, stdin );