#include <stdio.h>
#include <string.h>
#define MAX 1024
int main()
{
char str[MAX];
char ch;
int i, n, r = 1, c = 0, mc = 0;
// char result[r][mc];
printf("请输入一个英文句子:");
while((ch = getchar()) != '\n')
{
str[i] = ch;
i++;
}
n = strlen(str);
for (i = 0; i < n; i++)
{
if (str[i] == ' ')
{
r++;
if (mc < c)
{
mc = c;
}
c = 0;
continue;
}
c++;
}
printf("%d,%d\n", r, mc );
return 0;
}
这个程序目前的功能是输入一段话,根据空格来判断单词数和最长单词长度,运行结果会报segmentation fault
请大神帮忙看看是什么问题! 谢谢!
本帖最后由 小腿跑乱刀 于 2018-9-26 13:39 编辑
主要原因在于for循环中的if语句,
你的代码是每当遇到一个空格就会进行一次比较,
但是,当输入一系列单词后,最后的一个单词往往是不添加空格而是直接回车的,
这意味着你输入的最后一个单词实际上根本没有进行比较,也就没有纳入统计的结果之中。
当然除了这一个问题还有其他的一些问题需要你自己再思考着改改,比如你的变量r统计的是单词的个数吧,在还没有统计的时候单词个数应该为0,而你将其初始化为了1。
但恰巧就像我前面说的你的程序忽略了输入的最后一个单词,这反而造成了单词个数的统计结果是正确的(但实际上做法是错误的)。
我去上课前大概写了下,参考一下吧,可能也有错 #include <stdio.h>
#define IN 1
#define OUT 0
int main(int argc, char **argv)
{
int num_word = 0, maxlen = 0, count = 0;
int state = OUT;
char c;
int flag;
while((c = getchar()) != '\n')
{
flag = (c == ' ' | c == '\t');
if(!flag & state == OUT)
{
state = IN;
num_word++;
count++;
}
else if(!flag & state == IN)
{
count++;
}
else if(flag & state == IN)
{
if(count > maxlen) maxlen = count;
state = OUT;
count = 0;
}
}
if(count > maxlen) maxlen = count;
printf("num_word:%d maxlen:%d\n", num_word, maxlen);
return 0;
}
另外你是统计一句话的单词数,所以我给while的判断条件是不等于'\n',如果要统计一段话的单词书只需要不等于EOF或者不等于一个负整数就行了
|