我需要我的程序输入用户想要输入的句子数量,然后输入这些句子。然后,通过函数 letter()
传递它,我希望它计算每个字母在字符串中出现的次数。但是,我遇到了以下问题:
- 当我输入行数时,程序只要求用户输入比输入的数字少 1(即,如果我想要 2 个句子,系统只会提示我输入一个)。
- 字母计数不正常。看起来好像是随机的。
我还想知道我是否正确使用了我的 2D 数组(即我是否正确填充它以及我是否正确地通过函数传递它)。对于数组 str[][]
,我希望第一个框表示句子数,第二个框表示每行中的字符数。
这是我的代码:
#include <stdio.h>
void letter(int n, char str[][80]){
char c = 'a';
char alpha[26];
int ltrcnt[26];
for(int i = 0; i < 26; i++){
ltrcnt[i] = 0;
}
for(int i = 0; i < 26; i++){
for(int j = 0; j < 26; j++){
for(int k = 0; k < 26; k++){
if(str[i][j] == c){
ltrcnt[k]++;
}
c++;
}
}
}
c = 'a';
for(int i = 0; i < 26; i++){
printf("%c: %d\n", c, ltrcnt[i]);
c++;
}
}
int main(void){
int n;
printf("Enter number of lines: ");
scanf("%d", &n);
char str[n][80];
printf("Enter a sentecne: ");
for(int i = 0; i < n; i++){
fgets(str[i], 80, stdin);
}
letter(n, str);
}
最佳答案
第一个问题,fgets()
跳过一次迭代是因为剩余的 newline
在第一次输入后按 ENTER 键。
清除输入缓冲区换行符的简单情况是
scanf("%d%*c", &n); //eat the newline.
对于第二个问题,在函数内部,你有三个没有意义的嵌套循环。您没有使用 n
的值,任何地方。这没有任何意义,会导致垃圾输出。
例如,
- 你限制索引
j
至25
, 但实际上你接受它只要79
. - 你有循环变量
k
,使用不当。
一个合理的循环条件是,
-
i
最多n-1
(i<n
) 作为第一个索引。 -
j
直至终止 null,(arr[i][j]
) -
k
, 从a
开始, 直到z
, (int k = 'a'; k < ('z' + 1 ) ; k++
) [注意:这只计算小写字母]
关于计算一个句子的字母给出随机输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43342771/