读取三行文字并计算每个字母(C)的程序

时间:2017-05-16 03:01:54

标签: c string

我对编码很新,目前正在注册学校的C课程。我们的任务要求如下:

编写一个输入三行文本的程序,并使用函数strchr来确定字母表中每个字母的出现次数(大写和小写应该统计为相同)。将每个字母的总数存储在一个数组中并打印结果。

这是我到目前为止编写的代码:

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#define SIZE 100

int main(void) {
    int alphabet[26] = { 0 };
    char string[3][SIZE];
    int i, j;
    int c;

    printf("Enter three lines of text:\n");

    for (i = 0; i <= 2; i++) {
        fgets(string[i], SIZE, stdin);
    }

    for (i = 0; i <= 2; i++) {
        for (j = 0; &string[i][j] != '\0'; j++) {
            string[i][j] = tolower(string[i][j]);
        }
        for (j = 0; &string[i][j] != '\0'; j++) {
            if (strchr(&string[i][j], ('a' + j)) != NULL) {
                alphabet[j]++;
            }
        }       
    }
    printf("\n");

    for (i = 0; i < 26; i++) {
        printf("%c: %d\n", ('a' + i), alphabet[i]);
    }
    printf("\n");

    return 0;
}

我当前程序的问题是数组alphabet[]的计数器似乎没有正确递增计数。

例如,对于每个字母的每次出现,输出应该计数增加1,但结果都是0。

非常感谢任何其他提示或建议的话语!

2 个答案:

答案 0 :(得分:1)

您对行尾的测试是错误的, 无需循环几次只需解析字符串并计算字母数 你想要'a''z'之间的字母,检查字符是否在范围内并计算它

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#define SIZE 100

int main(void) {
    int alphabet[26] = { 0 };
    char string[3][SIZE];
    int i, j;

    printf("Enter three lines of text:\n");

    for (i = 0; i <= 2; i++) {
        fgets(string[i], SIZE, stdin);
    }

    for (i = 0; i <= 2; i++) {
        for (j = 0; string[i][j] != '\0'; j++) {
            char c = tolower(string[i][j]);
            if (c >= 'a' && c <= 'z') {
                alphabet[c - 'a']++;
            }
        }
    }
    printf("\n");

    for (i = 0; i < 26; i++) {
        printf("%c: %d\n", ('a' + i), alphabet[i]);
    }
    printf("\n");

    return 0;
}

答案 1 :(得分:0)

您需要从&amp; string [i] [j]!=&#39; \ 0&#39 ;;更改循环终止条件to string [i] [j]!=&#39; \ 0&#39 ;; strchr将从找到匹配的字符串返回地址,因此您应该保存非null地址以将其传递给下一次调用strchr 像这样:

tmpPtr = &string[i][j];
while ((tmpPtr=strchr(tmpPtr, string[i][j])) != NULL) {
alphabet[string[i][j] - 'a']++;
}