考虑以下代码:
#include <stdio.h>
int main (void)
{
char str1[128], str2[128], str3[128];
printf ("\nEnter str1: ");
scanf ("%[^\n]", str1);
printf ("\nstr1 = %s", str1);
printf ("\nEnter str2: ");
scanf ("%[^\n]", str2);
printf ("\nstr2 = %s", str2);
printf ("\nEnter str3: ");
scanf ("%[^\n]", str3);
printf ("\nstr3 = %s", str3);
printf ("\n");
return 0;
}
当它被执行时,只有第一个 scanf
会因提示而停止。该程序不会为下一个 scanf
停止。但是如果把格式字符串从"%[^\n]"
改成"%[^\n]"
(注意%<之前的空格
),那么它就可以正常工作。是否自动接受了先前输入缓冲区中的某些现有换行符?但是刷新 stdin
并不能解决这个问题。
这是什么原因。
最佳答案
您只需要在阅读完想要的内容后“消费”'\n'
字符即可。使用以下格式指令:
"%[^\n]%*c"
这会将换行符之前的所有内容读入您传入的字符串中,然后将使用单个字符(换行符)而不将其分配给任何内容('*'
是“赋值抑制” ).
否则,换行符将留在输入流中,等待立即终止后续的 "%[^\n]"
格式指令。
将空格字符添加到格式指令 ("%[^\n]"
) 的问题在于空格将匹配任何 空格。因此,它会吃掉上一个输入末尾的换行符,但它也会吃掉任何其他空格(包括多个换行符)。
更新您的示例:
char* fmt = "%[^\n]%*c";
printf ("\nEnter str1: ");
scanf (fmt, str1);
printf ("\nstr1 = %s", str1);
printf ("\nEnter str2: ");
scanf (fmt, str2);
printf ("\nstr2 = %s", str2);
printf ("\nEnter str3: ");
scanf (fmt, str3);
printf ("\nstr2 = %s", str3);
printf ("\n");
关于c - scanf: "%[^\n]"跳过第二个输入但 "%[^\n]"没有。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6083045/