Scanf未按预期读取用户输入

时间:2015-03-21 05:15:02

标签: c scanf

该计划没有按预期进行投入。当我输入t = 1l = 4时,内部循环只需要两个输入而不是四个。

int main() {
  int l, b, g, count, t, i;
  char s[10000];
  scanf("%d%d", &t, &l);

  while (t--) {
    for (i = 0; i < l; i++) {
      scanf("%c", s[i]);
      if (i > 0)
        if (s[i] == s[i-1])
          count++;
    }
    printf("%d\n", count);
  }
  getch();      
}

2 个答案:

答案 0 :(得分:3)

问题在于,当您为任何scanf输入字符时,请按Enter键。输入(如果有效)由scanf消耗,换行符(因为您按下回车键)保留在标准输入流(stdin)中。当下次调用scanf(带%c)时,它会在\n中看到stdin字符并使用它,因此不会等待进一步输入。< / p>

要解决此问题,请更改

scanf("%c",s[i]);

scanf(" %c",&s[i]);

%c指示scanf扫描任意数量的空白字符(包括无字符)之前的空格,直到第一个非空白字符。引用标准:

  

7.21.6.2 fscanf功能

     

[...]

     
      
  1. 由白色空格字符组成的指令通过读取输入来执行   第一个非空格字符(仍未读取),或直到不再有字符   被阅读。该指令永远不会失败。
  2.   
带有scanf格式说明符的

%c需要char*或换句话说,char的地址。您提供类型为s[i]的参数char。这将调用未定义的行为。 &是运算符的地址,在s[i]之前使用时,它会提供s[i]的地址,即char*

答案 1 :(得分:0)

int main(){

    int  l,b,g,count,t,i;
    char s[10000];
    scanf("%d%d",&t,&l);
    getchar();
    while(t--){
         for(i=0;i<l;i++){
               scanf("%c",s[i]);
                      if(i>0)
                         if(s[i]==s[i-1])
                              count++;

               }
     printf("%d\n",count);

     }

     getch();      
    }

这两个getchars用于清除&#39; \ n&#39;就在输入缓冲区中。虚拟的getchars只是采取了额外的&#39; \ n&#39;这将解决问题。