For循环在c语言中少扫描一次



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

下面是我的代码:
#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 %cn",counter[i],ab[i]);
  }
  return 0;
}

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

for(i=0; i<size; i++){
size = 7时

将循环7次。

你的问题如下:

输入一个数字
scanf("%d",&size);

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

scanf("%c",&temp);

看到换行符并使用它,从而使您认为循环执行的时间减少了1。您可以通过添加

来验证这一点
printf("Got '%c'", temp);

在循环中scanf后面。

使用

修复
scanf(" %c",&temp);

%c之前的空格将丢弃所有空白字符,直到第一个非空白字符。

问题是%c不像%f%d这样的数字格式那样跳过空白。

下面的scanf可用于跳过空白,然后读取下一个非白色字符。

scanf("% * n [t] % c",及临时);

*说扔掉读取的内容,不要将其存储在输出变量中。[...]指示读取与括号之间的字符匹配的任何字符序列,在本例中是空格、换行符或制表符。

将代码改为

#include <stdio.h>
int main(void) {
    char ab[] = "abcdefghijklmnopqrstuvwxyz", temp;
    int i, j, size, counter[26] = {0};
    scanf("%d", &size);
    for (i = 0; i <= size; ++i) {   // One more iteration for the loop
        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 %cn", counter[i], ab[i]);
    return 0;
}

但是,更喜欢一次读取字符串,而不是一个字符一个字符地读取

char str[size + 1];
scanf("%s", str);

最新更新