我正在尝试读取包含空格的几个字符串(每行一个字符串)。但是,我发现只有第一个scanf()有效。输入第一个字符串后,打印结果,不允许我输入第二个字符串。那是为什么?
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char str[128];
char str1[128];
scanf("%[^\n]", str);
scanf("%[^\n]", str1);
printf("%s\n", str);
printf("%s\n", str1);
return 0;
}
答案 0 :(得分:4)
scanf
不支持正则表达式。
但它不起作用的原因是因为在第一行和第二行之间你没有读取换行符。使用"%[^\n]"
,scanf
会尝试读取一个或多个非换行符。第二个调用不会读取任何内容,因为要读取的下一个字符是\n
。
以下内容将起作用:
#include <stdio.h>
int main() {
char str[128];
char str1[128];
scanf("%[^\n]", str);
getchar();
scanf("%[^\n]", str1);
printf("%s\n", str);
printf("%s\n", str1);
}
答案 1 :(得分:0)
您应该限制扫描并使用每行末尾的'\n'
:
scanf("%127[^\n]\n", str);
您应该检查返回值以检查scanf
是否确实扫描了整行。
它有两个原因可能会失败:
将fgets
用于工作会更有效。
答案 2 :(得分:0)
scanf("%[^\n]", str);
从不使用Enter或'\n'
。
一个简单的解决方案:
// scanf("%[^\n]", str);
*str = 0; scanf("%127[^\n]", str); getchar();
scanf("%[^\n]%*c", str)
以各种方式失败:
如果用户输入超过缓冲区大小-1,则str
为128 -1或127
如果用户输入仅为'\n'
,则不扫描任何内容,str
未初始化,'\n'
会留在stdin
以进行下一次输入。
总而言之,最好使用fgets()
if (fgets(str, sizeof str, stdin) == NULL) Handle_EOForIOerror();
// remove potential trailing `\n`
buffer[strcspn(buffer, "\n")] = 0;