2014-10-21 3 views
-3

Я пробовал столько кода, пытаясь отобразить мои данные в гистограмме. Я застрял в этой проблеме в течение двух дней, данные, просматривающие Интернет и такие, чтобы найти ответ, но обычно говорят о указателях и ect. в то время как это намного более основательно. Я пробовал фактическую гистограмму, которая отображала ту же ошибку, но ради сохранения ее просто я решил опубликовать ее.Почему я всегда получаю ошибки сегментации при отображении моего массива в C?

Это описание программы с языка программирования C: «Написать программу для печати гистограммы длин слов в его входе.» Я делаю это по горизонтали, то я сделаю это вертикально , Хотя, в этом примере я просто пытаюсь отобразить число, очевидно.

#include <stdio.h> 
#define MAXIMUM 99 


main() 
{ 
int i, c, j, lenOfWord[MAXIMUM], charCount; 

for (i = 0; i < MAXIMUM; i++) 
    lenOfWord[i] = 0; 


printf("Starting program, please type then ctrl+d\n"); 



while((c = getchar()) != EOF) { 
    if (c == ' ') { 
     //new word 
     ++lenOfWord[charCount]; 
     charCount = 0; 
    } 
    else 
     //inword 
     ++charCount; 
} 

printf("\n Displaying now... \n"); 


for (j = 0; j <= MAXIMUM; j++) 
    printf("%d: %d", j, lenOfWord[j]); 


} 

выход:

[email protected]:~/Desktop> gcc c.c -o c 
[email protected]:~/Desktop> ./c 
Starting program, please type then ctrl+d 
Hello my name is john jacksonSegmentation fault 

* ошибка сегментирования на конец то, что я получаю, когда я EOF (Ctrl + D)

Дополнительная информация: GCC компилятор из терминала в OpenSUSE Linux

Большое спасибо, я пытаюсь научиться C, но я ударил много дорожных блоков, подобных этим, я расстраиваюсь.

+1

Compile со всеми предупреждениями и отладочной информации ('НКУ -Wall -Wextra -g'). Используйте отладчик ('gdb') –

+3

' j> = MAXIMUM'? Это закончит ваш цикл на первой итерации. второе предложение 'for()' является условием завершения цикла. Пока условие оценивается как «true», цикл продолжает выполняться.Вы в основном настраиваете свои циклы на сбой, так как '0> = 99' является ложным сразу с места в карьер. –

+3

'int charCount = 0;' – BLUEPIXY

ответ

1

Реальная проблема заключается в

++lenOfWord[charCount]; 
     charCount = 0; 

Вы не инициализирован charCount к 0 перед его использованием. Инициализировать его в 0 первых перед циклом

charCount = 0; 

while((c = getchar()) != EOF) { 

И назначая charCount к 0 в петле, бесполезна. Убери это.

Вы должны проверить еще одну вещь. Поскольку размер массива равен MAXIMUM. Поэтому вам нужно поставить чек, чтобы charCount не превышал MAXIMUM. В противном случае он снова даст segmentation fault.

Другая проблема заключается в условии цикла цикла. Вместо

for (i = 0; i < MAXIMUM; i++) 

изменить его

for (i = 0; i < MAXIMUM; i++) 

И

Вместо того

for (j = 0; j >= MAXIMUM; j++) 

к

for (j = 0; j < MAXIMUM; j++) 

В противном случае вы не получите никакого выхода.

+0

Я думаю, что вы правы, большое вам спасибо. Хотя, я считаю, что установка charCount возвращается к 0 после того, как пространство имеет важное значение для программы. Количество символов после пробела равно 0. – user275564

+0

В чем разница между двумя первыми для операторов в вашем примере? – user275564

0

Ваша переменная charCount не инициализируется

+0

Спасибо, сэр/мама, проблема решена. Я думаю, что это была проблема в моих последних версиях программы. УРОК ВЫУЧЕН! – user275564