Как создать программу, которая выводит гистограмму букв из текстового файла на c

#c #file-io #char #histogram #counting

#c #file-io #символ #гистограмма #подсчет

Вопрос:

Таким образом, предполагается, что программа принимает текстовый файл только со строчными буквами и без пробелов. Например, «aabbhello». Затем программа распечатает гистограмму в командной строке:

 a: 2 
b: 2
h: 1
e: 1
l: 2
o: 1
  

то, что у меня сейчас есть, должно работать, но всегда дает мне странные результаты:

 void file_histogram(char *filename)
{
    FILE *fptr;
    int fsize;
    fptr = fopen(filename, "r");
    if(fptr == NULL) {
        printf("File did not open n");
    }
    fseek(fptr, 0, SEEK_END);
    fsize = ftell(fptr);
    char content[fsize];
    rewind(fptr);
    char c;
    int count1 = 0;
    while(fscanf(fptr, "%c", amp;c) == 1) {
        content[count1] = c;
        count1  ;
    }
    char name[fsize];
    int count[26];
    int i;
    for (i = 0; i < fsize; i  ) {
        //printf("%d", i);
        name[i] = content[i];
    }
    int length = strlen(name);
    for(i = 0; i < length; i  ) {
        count[i] = 0;
    }
    for(i = 0; i < length; i  ) {
        count[content[i] - 'a']  ;
    }
    for(i = 0; i < 26; i  ) {
        if(count[i] != 0) {
            printf("%c : %d n", i   'a', count[i]);
        }
    }
    fclose(fptr);
}
  

когда я компилирую программу, я печатаю буквы, которых даже нет в текстовом файле, с какой-то нелепой высокой частотой.

 a : 1
i : 1781796
l : 2
m : 1390299937
n : 32767
w : 1
  

Это то, что я получил, когда в моем текстовом файле в качестве содержимого было «william». Я, честно говоря, не знаю, что не так. Может быть, это связано с памятью? Любая помощь будет оценена!

Комментарии:

1. И вы пытались каким-либо образом отладить свою программу? А именно с помощью отладчика и / или инструкций debug print для отслеживания выполнения вашей программы? Пожалуйста, поделитесь с нами, какие отладочные данные вы нашли.

2. Для цикла, который инициализируется: —> count for(i=0;i<length; i ){ for(i=0;i<sizeof(count)/sizeof(count[0]); i ){

3. я провел некоторую отладку с помощью операторов печати, а именно, я распечатал содержимое, вывод был: william. Я также распечатал, сколько раз повторяется первый цикл for, что составляет 7 раз. Таким образом, в содержимом и имени массива должно быть только 7 элементов. Каждый из этих массивов должен иметь символы ‘w’ ‘i’ ‘l’ ‘l’ ‘i»a’ ‘m’. Но частота на выходе по-прежнему полностью отключена. Иногда встречаются буквы, которые даже не встречаются в имени.

4. Вы пытались исправить цикл for, как упоминалось в моем втором комментарии?

5. РАБОТАЕТ КАК ШАРМ! Спасибо. Я понял, что диапазон этого цикла for был неправильным. Когда вы создаете массив на c, кажется, что не все значения равны 0.