2016-07-31 2 views
0

Я возвращаюсь в кодировку через несколько лет из школы, и я застреваю, пытаясь написать программу на C, которая учитывает сколько n-буквенных слов находится в тексте, сохраняя их в массиве длины n, а затем печатая их. Проще говоря, я предположил, что n - это b/w 1 и 10, и каждое слово разделено ровно на одно место.Программа C для подсчета числа n-буквенных слов в тексте, застрявшем во вложенном цикле

Код, однако, кажется, моя программа никогда не выходит из внутреннего цикла, поэтому на экране ничего не печатается. Я попытался напечатать что-то в конце этого цикла, чтобы проверить его, и по какой-то причине программа печатает его столько раз, сколько символов (включая пробелы, которые внутреннее условие должно улавливать и выходить). Я что-то забыл?

main() 
{ 
int c, i, j, counter; 
counter = 0; 
int wlength [10]; 
for (i=0; i<10; ++i) //initialize array 
    wlength[i]=0; 
while((c=getchar())!=EOF){ // keep taking input until end of file 
    while (c!=' '){ //keep counting until you reach the end of the word 
     ++counter; 
     c=getchar(); 
    } 
    wlength [counter-1]++; //increment the counter for that word length 
    counter=0 ; //reset the counter for the next word 
} 
for (j=0;j<10;++j) //print the array 
    printf("%d ", wlength[j]); 
+0

Вам необходимо проверить EOF. Вы проверяете только во внешнем цикле. – stark

+1

Не последний символ каждой строки новой строки (\ n или \ r \ n)? – Roger

+0

try 'while (c! = '' && c! = '\ N' && c! = EOF) {' вместо 'while (c! = '') {' – BLUEPIXY

ответ

0

У вас есть две петли для чтения стандартного ввода, и только один для проверки EOF. Таким образом, ваша программа читает файл и застревает, если нет точно пробел до конца файла. Вы бы лучше только с одной петлей, заменив другие на if - else заявлении:

Pseudo-code : 
while (getchar and !EOF) 
{ 
    if (char isn't a space) 
    { 
     increment counter 
    } else { 
     increment value for given length 
     set first counter to 0 
    } 
} 

Вы должны также проверить, что вы находитесь в пределах вашего массива ... Слова «expotentially` существует; -)

+0

Спасибо за помощь! Да, кажется, я забыл добавить проверки для EOF и новой строки во внутреннем цикле. Опция if-else оператора также является хорошей точкой (как экспоненциально !!) – MMD00D

0

Проблема inner while loop. Потому что в unix или unix-подобной системе. В конце каждой строки находится \n. поэтому ваш код заблокирован в первом внутреннем цикле. вам нужно добавить дополнительную проверку. Условие испытания должно быть изменено на:

while(c != ' ' && c != '\n'){ 
    ++counter; 
    c=getchar(); 
} 

И я побежал, это сработало.

+0

Да, это то, что мы сказали ;-) Но, поймите, что файл обычно может легко содержать CR + LF (\ r \ n) , Так что этого кода недостаточно ... – Roger

+0

@Rogier Windows использует 'CR + LF' в конце строки. Если у вас есть 'mingw' или' cygwin' в Windows. Может использовать команду 'dos2unix' для ее преобразования. Но рассмотрите более портативные, условие может потребоваться добавить больше. –

+0

Да, спасибо! Похоже, что я забыл как новую строку, так и условие EOF во внутреннем цикле. Я должен был указать, что я использую машину Windows и запускаю ее в среде IDE (Code :: Blocks). – MMD00D