为何使用scanf()的%[^ ]格式输入含空格字符串无输出?
问题原因及解决办法
你的代码核心问题是scanf格式符写错了:你用了全角的˄,但scanf要求的是半角的脱字符^,正确的格式符应该是%[^\n]。
具体分析
- 当你写
%[˄\n]时,scanf会把˄当成普通匹配字符,它会尝试从输入中读取这个全角符号,但你输入的This is a text里根本没有这个字符,导致scanf匹配失败,不会往str里写入任何内容。而str是未初始化的局部数组,里面是随机垃圾值,printf输出时可能因为第一个字符就是'\0',看起来像没有输出,或者输出乱码。 - 换成半角的
%[^\n]后,scanf会读取所有字符直到遇到换行符\n为止,这样就能正确读取包含空格的整行输入了。
优化后的代码
还要注意两个细节:一是%[^\n]不会自动跳过输入开头的空白字符;二是如果输入字符长度超过数组大小,会导致缓冲区溢出。所以最好加上长度限制,比如%99[^\n](因为str是100个字符,要留一个位置给字符串终止符\0):
#include <stdio.h> int main(void) { char str[100]; printf("Enter a string: "); // 使用半角^,并限制读取长度为99 scanf("%99[^\n]", str); printf("%s\n", str); return 0; }
额外提示
如果你的输入前有残留的换行符(比如之前用scanf读取其他类型数据后),%[^\n]会直接匹配失败,因为第一个字符就是\n。这种情况下可以在格式符前加一个空格跳过空白:scanf(" %99[^\n]", str),空格会匹配任意数量的空白字符(包括换行、空格、制表符等)。
内容的提问来源于stack exchange,提问作者Anadelta
相关产品推荐
相关产品推荐

