对于循环扫描,c中的时间少一个

Χρή*_*ρης 2 c loops for-loop scanf

用户输入一串字符,但在此之前输入字符串的大小.然后我必须阅读并计算每个字母输入的次数.

这是我的代码:

#include <stdio.h>

char ab[] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'}; //Size = 26

int main(void)
{

  int i, j, size, counter[26];
  char temp;

  for(i=0; i<26; i++)
  { 
      counter[i]=0;
  }

  scanf("%d",&size);

  for(i=0; i<size; i++)
  {
    scanf("%c",&temp);

    for(j=0; j<26; j++)
    {
          if(ab[j]==temp)
          {
            counter[j]++;
              break;
          }
      }
  }

  for(i=0; i<26; i++) 
  {
      printf("We have %d %c\n",counter[i],ab[i]);
  }

  return 0;

}
Run Code Online (Sandbox Code Playgroud)

这是我的问题:
在给定的代码中,读取的for循环最后一次执行.因此,例如,如果输入7,它将执行6次而不是7次,即使它从0开始.你知道问题是什么吗?

Spi*_*rix 7

for(i=0; i<size; i++){
Run Code Online (Sandbox Code Playgroud)

size是7 时将循环7次.

你的问题如下:

您输入一个数字

scanf("%d",&size);
Run Code Online (Sandbox Code Playgroud)

并按Enter.上面scanf扫描数字并'\n'在标准输入流中留下换行符(\n ).在第一个循环的第一次迭代中,

scanf("%c",&temp);
Run Code Online (Sandbox Code Playgroud)

看到换行符并因此消耗它,让你认为循环执行的时间少了1个.您可以通过添加来验证这一点

printf("Got '%c'", temp);
Run Code Online (Sandbox Code Playgroud)

scanf循环之后.

通过使用修复它

scanf(" %c",&temp);
Run Code Online (Sandbox Code Playgroud)

%c删除所有空白字符之前的空格,直到第一个非空白字符为止.