用户输入一串字符,但在此之前输入字符串的大小。然后我必须阅读并计算每个字母输入的次数。
这是我的代码:
#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开始。你知道问题是什么吗?
答案 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);