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

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

这是我的代码:

#include  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开始。你知道问题是什么吗?

 for(i=0; i 

size为7时,将循环7次。

你的问题如下:

您输入一个数字

 scanf("%d",&size); 

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

 scanf("%c",&temp); 

看到换行符然后消耗它,让你认为循环执行的时间少了1个。 您可以通过添加来validation这一点

 printf("Got '%c'", temp); 

在循环中的scanf之后。

使用修复它

 scanf(" %c",&temp); 

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

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

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

scanf(“%* [\ n \ t]%c”,&temp);

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

将您的代码更改为

 #include  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);