猿问

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

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并不能解决这个问题。

造成这种情况的原因是什么。


慕村9548890
浏览 836回答 3
3回答

喵喵时光机

你只需要'\n'在阅读完你想要的东西后“消费”这个角色。使用以下格式指令:"%[^\n]%*c"哪个会将新行中的所有内容读入您传入的字符串中,然后将使用单个字符(换行符)而不将其分配给任何内容(即'*'“赋值抑制”)。否则,换行符将保留在输入流中,等待立即终止后续"%[^\n]"格式指令。向格式指令(" %[^\n]")添加空格字符的问题是空格将匹配任何空格。因此,它将从前一个输入结束时吃掉换行符,但它也会吃掉任何其他空格(包括多个换行符)。更新您的示例:&nbsp;&nbsp;char*&nbsp;fmt&nbsp;=&nbsp;"%[^\n]%*c"; &nbsp;&nbsp;printf&nbsp;("\nEnter&nbsp;str1:&nbsp;"); &nbsp;&nbsp;scanf&nbsp;(fmt,&nbsp;str1); &nbsp;&nbsp;printf&nbsp;("\nstr1&nbsp;=&nbsp;%s",&nbsp;str1); &nbsp;&nbsp;printf&nbsp;("\nEnter&nbsp;str2:&nbsp;"); &nbsp;&nbsp;scanf&nbsp;(fmt,&nbsp;str2); &nbsp;&nbsp;printf&nbsp;("\nstr2&nbsp;=&nbsp;%s",&nbsp;str2); &nbsp;&nbsp;printf&nbsp;("\nEnter&nbsp;str3:&nbsp;"); &nbsp;&nbsp;scanf&nbsp;(fmt,&nbsp;str3); &nbsp;&nbsp;printf&nbsp;("\nstr2&nbsp;=&nbsp;%s",&nbsp;str3); &nbsp;&nbsp;printf&nbsp;("\n");

梵蒂冈之花

另外:要读取字符串:scanf("%[^\n]\n",&nbsp;a);//它意味着读到你遇到'\ n',然后删除'\ n'
随时随地看视频慕课网APP
我要回答