用户输入一串字符,但在此之前他输入了字符串的大小。然后我必须阅读并计算每个字母出现的次数。
下面是我的代码:#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);