当我用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的发行版上工作)时,当前的终端会话也不会挂起,并且程序只会继续运行。可能是什么问题?
答案 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
循环内?如果这样,则需要在循环主体上使用花括号。)大多数错误源于对该问题的误解。您无需存储所有单词的长度即可找到最排序和最长的单词。仅跟踪当前单词的长度就足够了。算法如下:
这使您可以找到 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;
}