计算一个句子的字母给出随机输出

标签 c arrays string scanf fgets

我需要我的程序输入用户想要输入的句子数量,然后输入这些句子。然后,通过函数 letter() 传递它,我希望它计算每个字母在字符串中出现的次数。但是,我遇到了以下问题:

  1. 当我输入行数时,程序只要求用户输入比输入的数字少 1(即,如果我想要 2 个句子,系统只会提示我输入一个)。
  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 的值,任何地方。这没有任何意义,会导致垃圾输出。

例如,

  • 你限制索引j25 , 但实际上你接受它只要 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/

相关文章:

c - 从字符串中提取 int 值

java - 如果输入中包含数组中的某些内容,如何用数组中的元素替换输入中的字符串序列?

c++ - 链接现成的外部静态库

c++ - 查找加起来等于特定数字倍数的数组子集的数量

javascript - React 组件中的 onChange 行为不符合预期

javascript - 是否可以在 ASP.NET MVC4 中使用一个 Controller 函数在 View 中返回两个数组?

c++ - 从C++中的txt文件中读取字符

c - C 到底在哪些场景下会抛出段错误?

c++ - 如何在 parasoft cpptestcli 中设置编译器路径?

swift - 由于 'internal' 保护级别,“indexOf”无法访问