为了账号安全,请及时绑定邮箱和手机立即绑定

scanf:“%[^ \ n]”跳过第二个输入,但“%[^ \ n]”不跳过。为什么?

scanf:“%[^ \ n]”跳过第二个输入,但“%[^ \ n]”不跳过。为什么?

C
慕村9548890 2019-08-19 14:13:29
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");


查看完整回答
反对 回复 2019-08-19
?
梵蒂冈之花

TA贡献1900条经验 获得超5个赞

另外:要读取字符串:

scanf("%[^\n]\n", a);

//它意味着读到你遇到'\ n',然后删除'\ n'


查看完整回答
反对 回复 2019-08-19
  • 3 回答
  • 0 关注
  • 835 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信