Нет вывода при выполнении программы на C - PullRequest
0 голосов
/ 09 апреля 2020

Когда я компилирую эту программу с g cc:

#include <stdio.h>

/* This program accepts some text as an input and gives the output
 * of longest word and shortest word lengths*/

int main(){
int c, i, wordcount, symbolcount, longestword, shortestword;
wordcount = symbolcount = longestword = shortestword = 0;
int wlength[1];
while((c = getchar()) != EOF){
    ++symbolcount;
    if(c == ' ' || c == '\n' || c == '\t'){
        ++wordcount;
        wlength[wordcount];
        wlength[wordcount - 1] = symbolcount;
        symbolcount = 0;
    }
}
for(i = 0;i <= wordcount;)
wlength[0] = longestword;
wlength[i] = shortestword;
while(shortestword < 1){
    if(shortestword == longestword){
        continue;
        ++i;
    }else if(shortestword < longestword && shortestword > 0){
        shortestword = wlength[i];
        break;
    }
}
for(i = 0; i <= wordcount - 1; ++i){
    if(wlength[i] > longestword){
        longestword = wlength[i];
    }else if(wlength[i] < longestword && wlength[i] > shortestword){
        continue;
    }else{
        wlength[i] = shortestword;
        }
    }
printf("%d\t%d", longestword, shortestword);
return 0;
}

Нет ошибок или предупреждений. Но когда я пытаюсь запустить его, он принимает входные данные, но не выводит вообще. Даже когда я нажимаю Ctrl + D (я работаю в дистрибутиве на основе Debian), текущий сеанс терминала не приостанавливается, и программа просто продолжает работать. В чем может быть проблема?

Ответы [ 3 ]

1 голос
/ 09 апреля 2020

Вы объявили целочисленную длину массива, размер которой равен 2, т. Е.

int wlength[1];

и в условии if вы увеличиваете wordcount.

Теперь предположим, что у вас есть 4 слова в строке, а количество слов продолжает увеличиваться и будет присвоено wlength index, но так как вы определили размер массива 2, в котором он переполняется. Таким образом, когда это используется далее в

 shortestword = wlength[i]; 

и

longestword = wlength[i];

, это приводит к назначению нежелательных значений.

1 голос
/ 09 апреля 2020

В вашей программе есть несколько ошибок.

  • Вы не выделяете место только для одного слова.
  • У вас есть бесконечное число l oop больше i , Именно поэтому вы не видите никакого вывода: программа застряла в этом l oop.
  • Второй while l oop не выглядит так, как будто вы знали, что делаете там , Я сомневаюсь, что условие shortestword < 1 когда-либо будет выполнено. A contunue перед другими утверждениями делает эти заявления бесполезными. И что именно здесь i. (Хорошо, возможно, while должен находиться внутри for l oop? Если это так, вам нужны фигурные скобки на теле l oop.)

Большая часть ошибки возникают из-за неправильного понимания проблемы. Вам не нужно хранить длины всех слов, чтобы найти самые короткие и длинные слова. Достаточно просто отслеживать длину текущего слова. Алгоритм выглядит следующим образом:

  • установить самое длинное в 0.
  • установить самое короткое в большое число.
  • установите длину в 0.
  • для каждого символа на входе:
    • , если это символ пробела:
      • update самые длинные и самые короткие при необходимости.
      • сброс длина до 0.
    • в противном случае:
      • увеличение длина

Это позволяет найти самое длинное слово в Моби-Дик , не имея хранить больше, чем текущая длина слова. в C это может выглядеть так:

#include <stdio.h>

int main(void)
{
    int longest = 0;            // length of currently longest word
    int shortest = 0;           // length of currently shortest word

    int length = 0;             // length of current word
    int c = getchar();

    while (c != EOF) {
        if (c == ' ' || c == '\n' || c == '\t') {
            if (length) {
                if (longest == 0 || length < shortest) shortest = length;    
                if (length > longest) longest = length;

                length = 0;
            }
        } else {
            length++;
        }

        c = getchar();
    }

    printf("max: %d\nmin: %d\n", longest, shortest);

    return 0;
}
1 голос
/ 09 апреля 2020

Проблема в том, что

int wlength[1];

объявляет массив только с одним элементом, но вы получаете доступ за пределами с помощью

shortestword = wlength[i];

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

Чтобы исправить это, объявите массив с таким количеством элементов, как вы ожидаете, i. Убедитесь, что ваши циклы над i принимают только те значения, которые не превышают количество элементов массива.

...