#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.