在C上执行程序时未提供输出

时间:2020-04-09 07:48:53

标签: c output

当我用gcc编译该程序时:

#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 个答案:

答案 0 :(得分:1)

问题是

int wlength[1];

仅声明一个带有一个元素的数组,但是您使用

进行了访问

shortestword = wlength[i];

这是C语言中的未定义行为,任何事情都可能发生,包括您观察到的情况。

要解决此问题,请声明数组,其中包含与您期望的i一样多的元素。 确保在i上的循环仅采用不超过数组元素计数的值。

答案 1 :(得分:1)

您已声明一个整数数组,其长度为2,即

int wlength[1];

,并在if条件下增加字数。

现在假设您在一行中有4个单词,并且单词数一直在增加,并且将分配给 wlength index ,但是正如您定义的数组大小2一样,它在此处溢出。因此,当

中进一步使用该功能时
 shortestword = wlength[i]; 

longestword = wlength[i];

它导致分配垃圾值。

答案 2 :(得分:1)

程序有几处错误。

  • 您不会只为一个单词分配空间。
  • 您在i上有无限循环。这就是为什么您看不到任何输出的原因:该程序停留在此循环中。
  • 第二个while循环看起来并不像您知道自己在做什么。我怀疑条件shortestword < 1是否会成立。其他语句之前的contunue使这些语句无用。 i到底是什么。 (好吧,也许while应该在for循环内?如果这样,则需要在循环主体上使用花括号。)

大多数错误源于对该问题的误解。您无需存储所有单词的长度即可找到最排序和最长的单词。仅跟踪当前单词的长度就足够了。算法如下:

  • 最长设置为0。
  • 最短设置为较大的数字。
  • 长度设置为0。
  • 对于输入中的每个字符:
    • 如果是空格字符:
      • 根据需要更新最长最短
      • 长度重置为0。
    • 否则:
      • 增加长度

这使您可以找到 Moby-Dick 中最长的单词,而不必存储超过当前单词长度的单词。在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;
}