scanf:“%[^ \ n]”跳过第二个输入,但“%[^ \ n]”不跳过。为什么?请考虑以下代码:#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提示的第一站时。该计划不会停止下一个scanfs。但是如果格式字符串从更改"%[^\n]"为" %[^\n]"(注意之前的空格%),那么它可以正常工作。是否会自动接受先前输入缓冲区中的某些现有换行符?但冲洗stdin并不能解决这个问题。造成这种情况的原因是什么。
3 回答
喵喵时光机
TA贡献1846条经验 获得超7个赞
你只需要'\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");
- 3 回答
- 0 关注
- 835 浏览
添加回答
举报
0/150
提交
取消