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

时间:2015-07-08 10:32:27

标签: 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;

}

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

3 个答案:

答案 0 :(得分:7)

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

将循环7次。

您的问题如下:

您输入

的数字
scanf("%d",&size);

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

scanf("%c",&temp);

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

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

在循环中的scanf之后。

使用

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

%c之前的空格会丢弃所有whitespace characters,包括无空格,直到第一个非空白字符。

答案 1 :(得分:1)

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

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

  

scanf(&#34;%* [\ n \ t]%c&#34;,&amp; temp);

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

答案 2 :(得分:0)

将您的代码更改为

#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 %c\n", counter[i], ab[i]);
    return 0;
}

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

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