C语言 查找一行字符串最长的单词

找了半天没找到错。麻烦各位帮忙看一下。
#include<stdio.h>
#include<string.h>

char * find(char *p);
int length(char *p);

void main()
{
char * b;
char a[100];
gets(a);
b=find(a);
printf("%s\n",b);
}

char * find(char *p)
{
int i,j=0,x,y;
char *qq[100]={NULL};
char * b;
for(i=0;i<100;i++)
{
if(p[i]==' ')
{
p[i]='\0';
qq[j++]=&p[i+1];
}
}
for(i=0;i<99;i++)
{
x=length(qq[i]);
y=length(qq[i+1]);
if(x>y)
{
b=qq[i];
}
}
return b;
}

int length(char *p)
{
int i=0;
while(p[i]!='\0')
{
i++;
}
return i;
}

1. qq[j++]=&p[i+1];这个逻辑把p中的第一个字符串给丢掉了
2. for(i=0;i<99;i++)要比较的是b的长度和qq[i]的长度,而不是qq[i]和qq[i+1]的长度
3. char *qq[100]={NULL};中的有效值是有限的,受输入的长度限制,在“2”循环中访问了它所有的值指向的内容,会访问到无效地址而导致程序中断退出
温馨提示:答案为网友推荐,仅供参考
第1个回答  2015-06-26
#include <stdio.h>
#include <string.h>
//用于判断字符是否是英文字节
int word(char c)
{
if((c>='a'&&c<='z')||(c>='A'&&c<='Z')) return 1;
else return 0;
}
int longest(char str[])
{
int i,flag=1,len=0,point,max_len=0,max_point;
//遍历字符
for(i=0;i<=strlen(str);i++)
{
//判断是否为英文
if(word(str[i]))
{
if(flag==1)
{
//单词第一个找到后改变标志
point=i;
flag=0;
}
else len++; //开始对这个单词长度进行累加
}
else //非英文字母
{
//等待第一个英文字母的出现
//所以flag=1(要是下一个是英文字母的话就能执行上面的if)
flag=1;
//之前累加的单词长度是否比上一个单词更长
//(第一次的话max_len初始化为0,len必大于max_len)
if(len>max_len)
{
//将单词长度保存下来
max_len=len;
//将最长单词的第一个英文字母在字符串中的位置保存下来
max_point=point;
}
len=0;
}
}
return (max_point);
}
int main()
{
int word(char c);
int longest(char str[]);
int i;
char str[80];
printf("输入一行字符串\n\n");
gets(str);
printf("\n\n最长的单词为:\n\n");
for(i=longest(str);word(str[i]);i++)
printf("%c",str[i]);
printf("\n");
return 0;
}

用这个来做啊,希望对你有所帮助呢本回答被网友采纳
相似回答