Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.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
为什么printf只打印通过scanf读取输入的字符数组的第一个字符_C - Fatal编程技术网

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

为什么printf只打印通过scanf读取输入的字符数组的第一个字符,c,C,这段代码应该通过scanf读取输入字符串,并将输入字符串存储在这里声明为msg[]的数组中,然后打印这些输入字符串,但当我运行代码时,它打印的只是字符串的第一个字符。这看起来很简单,但我无法解决它 如果我键入I do,它只报告I #include <stdio.h> int main() { char msg[5]; printf("enter the message: "); scanf("%s",msg); printf(

这段代码应该通过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); 
}
#包括
int main()
{
char-msg[5];
printf(“输入消息:”);
scanf(“%s”,msg);
printf(“输入的消息为:%s”,消息);
}

答案隐藏在注释中。OP声明
如果我输入“我愿意”,它只打印“我”


scanf只读取到第一个空格(即
i-do
中的
i

如果输入4个字符,将打印4个字符


请编辑您的问题以包含此信息,以供将来的搜索者使用。

答案隐藏在评论中。OP声明
如果我输入“我愿意”,它只打印“我”


scanf只读取到第一个空格(即
i-do
中的
i

如果输入4个字符,将打印4个字符


请编辑您的问题以包含此信息,供将来的搜索者使用。

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

如果要读取带空格的字符串,则必须使用其他方法。您可以像这样使用
%[
转换说明符:

scanf( "%[^\n]", msg );
它将读取所有内容(包括前导空格字符),直到看到
'\n'
换行符并将其存储到
msg
。不幸的是,这(以及上面的
%s
说明符)让您面临缓冲区溢出-如果用户输入的字符串长度超过
msg
的大小,则
scanf
会很高兴地将这些额外字符写入
msg
缓冲区后的内存,从而导致各种混乱。为了防止这种情况,您可以在转换规范中使用字段宽度,如下所示:

scanf( "%4[^\n]", msg );
这会告诉
scanf
msg
中读取不超过4个字符。不幸的是,该宽度必须硬编码-不能像使用
printf
那样将其作为参数传递

在我看来,更好的方法是使用fgets
fgets

fgets( msg, sizeof msg, stdin ); 

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

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

scanf( "%[^\n]", msg );
它将读取所有内容(包括前导空格字符),直到看到
'\n'
换行符并将其存储到
msg
。不幸的是,这(以及上面的
%s
说明符)让您面临缓冲区溢出-如果用户输入的字符串长度超过
msg
的大小,则
scanf
会很高兴地将这些额外字符写入
msg
缓冲区后的内存,从而导致各种混乱。为了防止这种情况,您可以在转换规范中使用字段宽度,如下所示:

scanf( "%4[^\n]", msg );
这会告诉
scanf
msg
中读取不超过4个字符。不幸的是,该宽度必须硬编码-不能像使用
printf
那样将其作为参数传递

在我看来,更好的方法是使用fgets
fgets

fgets( msg, sizeof msg, stdin ); 

您的数组最多可以存储
4个字符
和一个
null终止符
…至少可以存储,但最多可以存储4个字符。顺便问一下,用户输入是什么?@LPs如果之前调用了UB,则不会扫描4个字符。我给它的任何输入仅打印第一个字符,例如,如果我输入“我愿意”它只打印“i”和“yea”,即使我输入的内容超过了数组的指定大小,例如“我喜欢我做的食物”即使这样,它也只打印“i”嘿,谢谢大家,我的问题已经解决了。它只打印第一个字符,因为我在第一个字符后提供了空间。你的数组最多可以存储
4个字符
,加上
null终止符
。。至少不能,但最多可以打印4个字符。顺便问一下,用户输入是什么?@LPs如果它以前调用过UB,则不能InSorry atmost 4个字符。我给它的任何输入只打印第一个字符,例如,如果我给输入“我做”,它只打印“我”,即使我给的输入超过指定的数组大小,例如“我喜欢我做的食物”即使这样,它也只打印“i”嘿,谢谢大家我的问题已经解决了。它只打印第一个字符,因为我在第一个字符“scanf只读取到第一个空格”后提供了空格-->这取决于格式。
%s
首先读取并丢弃前导空格-它不会停止。然后它读取非空格字符直到到达空格。@chux-正确,我回答了OP提出的问题:)“scanf只读取到第一个空格”->,这取决于格式。
%s
首先读取并丢弃前导空格-它不会停止。然后它读取非空格字符,直到到达空格。@chux-正确,我回答了OP提出的问题:)