输入一句话,输出最长的单词

陈思有 2011-03-09 10:37:06
#include <stdio.h>
void main()
{
void longest(char string[100]);
char string[100];
gets(string);
longest(string);
}
void longest(char string[100])
{
char s[20];
int i,j=0,k=0,t[100],c[100],m,b,a,sum=0,n=0;
for(i=0;string[i]!='\0';i++) /*将每个单词的长度作为t[k]数组的一个元素*/
{
if(string[i]!=' ')j++;
else
{
t[k]=j;
k++;
j=0;

}

}
a=k;
for(m=0,k=0;m<a;m++,k++)/*将数组t[k]中的所有元素复制到另一个数组c[m]*/
c[m]=t[k];
for(b=1;b<a;b++)/*找到组t[ ]中的最大值*/
if(t[b]<t[b-1])
t[b]=t[b-1];
for(m=0;c[m]!=t[b];m++)/*计算最长的单词前面所有字符的个数,加一是因为有空格*/
sum=c[m]+1+sum;
for(n=0;(string[sum]!='\0')||(string[sum]!=' ');sum++,n++)/*找到最长的单词*/
{
s[n]=string[sum];
}
for(i=0;i<n;i++)
printf("%c",s[i]);
printf("\n");
}
...全文
1095 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhgw2000 2011-11-28
  • 打赏
  • 举报
回复
// uniquesoft1.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "iostream"
#include<stdio.h>
longest(char str[])
{
int i,lenth=0,maxlenth=0,point,p=1,place;
for(i=0;str[i]!='\0';i++)
if(str[i]!= ' ')
{
if(p) //开始计算字母个数,同时标记单词起始位置
{
point=i;
p=0;
}
lenth++;
}

else
{p=1;
if(maxlenth<lenth)
{
maxlenth=lenth;
lenth=0;
place=point;
}
}

return(place);

}
void main()
{
int i;
char line[100];
gets(line);
printf("The longest word is :");
for(i=longest(line);line[i]!= ' ';i++)
printf("%c",line[i]);
printf("\n");
system("pause");
}


修改版
[Quote=引用 19 楼 zhgw2000 的回复:]

引用 18 楼 zhgw2000 的回复:

引用 17 楼 depad 的回复:

C/C++ code
#include<stdio.h>
int alph(char c)
{
if((c>='a'&amp;amp;&amp;amp;c<='z')||(c>='A'&amp;amp;&amp;amp;c<='Z'))
return(1);
……
[/Quote]
zhgw2000 2011-11-28
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 zhgw2000 的回复:]

引用 17 楼 depad 的回复:

C/C++ code
#include<stdio.h>
int alph(char c)
{
if((c>='a'&amp;&amp;c<='z')||(c>='A'&amp;&amp;c<='Z'))
return(1);
else
return(0);
}
longest(char str[])
……
[/Quote]

OH。。。我错了~不能省去,前面还有调用呢..哈哈
zhgw2000 2011-11-28
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 depad 的回复:]

C/C++ code
#include<stdio.h>
int alph(char c)
{
if((c>='a'&&c<='z')||(c>='A'&&c<='Z'))
return(1);
else
return(0);
}
longest(char str[])
{
int i,lenth=0,maxlen……
[/Quote]

LS超NB的!
不过最后调用longest函数里边的alpha(line)是否应改为alpha(line[i])
或者我们默认句子中只含有字母和空格,就可以省去alpha()函数
newfarmerchi 2011-03-11
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 csiyou 的回复:]
;(string[sum]!='\0')||(string[sum]!=' ');
这个问题在哪里
[/Quote]
仔细想了一下,这个结束条件实际上是形成了无限循环。当string[sum]到末尾时
即到'\0'时,它又不是空格,满足循环条件,继续往下走,当然也就越界了。
depad 2011-03-11
  • 打赏
  • 举报
回复
#include<stdio.h>
int alph(char c)
{
if((c>='a'&&c<='z')||(c>='A'&&c<='Z'))
return(1);
else
return(0);
}
longest(char str[])
{
int i,lenth=0,maxlenth=0,point,p=1,place;
for(i=0;str[i]!='\0';i++)
if(alph(str))
if(p) //开始计算字母个数,同时标记单词起始位置
{
point=i;
p=0;
}
else
lenth++;
else
{
p=1;
if(maxlenth<lenth)
{
maxlenth=lenth;
lenth=0;
place=point;
}
}
return(place);
}
main()
{
int i;
char line[100];
gets(line);
for(i=longest(line);alph(line);i++)
printf("%c",line);
printf("\n");
}








william_unique 2011-03-11
  • 打赏
  • 举报
回复
EOF
newfarmerchi 2011-03-10
  • 打赏
  • 举报
回复

/*还有这个方法*/
#include <stdio.h>
#include <string.h>
int main ()
{
char str[100];
char *p,*p1;
int len;
printf("please enter a string \n");
gets(str);
p=strtok(str," ");
len = strlen (p);
p1=p;
while (p!=NULL)
{
if (strlen (p)>len)
{
len=strlen(p);
p1=p;
}
p=strtok(NULL," ");
}
printf("%s\n",p1);

return 0;
}
赵4老师 2011-03-10
  • 打赏
  • 举报
回复
恐怕要
strtok( string, " ,\t\n\r.!/\?\"\'\\" );

striving_boy 2011-03-10
  • 打赏
  • 举报
回复
C 代码:
#include <stdio.h>
#include <string.h>

void func(char *);

int main()
{
char str[100];
printf("Please input a string :\n");
gets(str);
printf("The longest world in the string is :\n");
func(str);
puts("");
return 0;
}

void func(char *s)
{
int length = 0;
int i = 0;
int len=0;
int index = 0;
int loc=0;
for(i=0; i < (signed)strlen(s); ++i)
{
if((s[i] >='a' && s[i] <= 'z') || (s[i] >= 'A' && s[i] <= 'Z'))
{
length ++;
index = i;
if(length > len)
{
len = length;
loc = index;
}
}
else
{
length = 0;
}
}
for(i = loc-length+1; i <= loc; ++i)
printf("%c", s[i]);
}
AnYidan 2011-03-10
  • 打赏
  • 举报
回复
如何判断一句话结束哪,\r\n ? or EOF ?
乐CC 2011-03-10
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 newfarmerchi 的回复:]
C/C++ code

/*
1. 是按照你的思路改的,(当然有很多方法,如用字符串的函数strlen()等),
2. 问题主要是如果最长的字符串在最后,你的方法并没有把他的长度计算进来,因为string[i]=='\0';了。
3. 找到最长的单词的方法也做了改动,不去比较空格或'\0',你已经计算了长度,以及
最长字符串的起点,从起点开始把那个长度的字符copy到s[n]中,……
[/Quote]
可以考虑这样的方法:
从开始移动游标,判断是否为空格或结束符;
如果是,计算和上一个起点间的距离即为单词长度;
判断是不是最大值,如果是保存距离和上一个起点;
最长的字符串是你保存的起点开始至偏移距离的那一段。
newfarmerchi 2011-03-10
  • 打赏
  • 举报
回复

/*
1. 是按照你的思路改的,(当然有很多方法,如用字符串的函数strlen()等),
2. 问题主要是如果最长的字符串在最后,你的方法并没有把他的长度计算进来,因为string[i]=='\0';了。
3. 找到最长的单词的方法也做了改动,不去比较空格或'\0',你已经计算了长度,以及
最长字符串的起点,从起点开始把那个长度的字符copy到s[n]中,最后加个'\0'就可以了。
4. 最后,单个字符串的长度是不能超过20的,否则程序就崩溃了(注意一下)*/

#include <stdio.h>
void main()
{
void longest(char string[100]);
char string[100];
gets(string);
longest(string);
}
void longest(char string[100])
{
char s[20];
int i,j=0,k=0,t[100],c[100],m,b,a,sum=0,n=0,max;//加了个max
for(i=0;string[i]!='\0';i++) /*将每个单词的长度作为t[k]数组的一个元素*/
{
if(string[i]!=' ')j++;
else
{
t[k]=j;
k++;
j=0;
}
}
t[k]=j;//把最后一个字符串也要加进去。
a=k;
for(m=0,k=0;m<=a;m++,k++)/*将数组t[k]中的所有元素复制到另一个数组c[m]*/
c[m]=t[k];
max=t[0];//设max为最大
for(b=0;b<=a;b++)/*找到组t[ ]中的最大值*/
if(t[b]>max)
{
max=t[b];
}
for(m=0;c[m]!=max;m++)/*计算最长的单词前面所有字符的个数,加一是因为有空格*/
sum=c[m]+1+sum;
for(n=0,a=sum;a<sum+max;a++,n++)/*找到最长的单词*/
{
s[n]=string[a];
}
s[n]='\0';
for(i=0;i<n;i++)
printf("%c",s[i]);
printf("\n");
}

smallred123456 2011-03-10
  • 打赏
  • 举报
回复
#include<stdio.h>
#include<string.h>
#define N 200
#define M 30
void main()
{
char string[N],word[M];//word[M]记录最长的单词
int max=0;//记录最长单词的长度
int length=0;//纪录数组的长度
printf("请输入一段英文:");
gets(string);
length=strlen(string);
for(int i=0,j=0;i<length;i+=(j+1))
{
for(j=0;string[i+j]!=' '&&(i+j)<length;j++)
{}
if(max<j)
{
max=j;
for(int q=0;q<j;q++)
word[q]=string[i+q];//复制单词
}
}

printf("最长的单词是:");
for(i=0;i<max;i++)
printf("%c",word[i]);
printf("\n");
}


比较笨的方法,,,,,
newfarmerchi 2011-03-10
  • 打赏
  • 举报
回复
另外,还要考虑到,输入的字符串,最长的子字符串可能在开头,也可能在中间,
(string[sum]!='\0')||(string[sum]!=' ');是说只要string[sum]!='\0',就要
继续执行赋值操作,那s[n]可能就是多个字符串了。
newfarmerchi 2011-03-10
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 csiyou 的回复:]
;(string[sum]!='\0')||(string[sum]!=' ');
这个问题在哪里
[/Quote]

如果输入的字符串最后没有空格,即以'\0'直接结束,还可以。但如果输入的字符串
后面都是空格,如 "aaa bbbbbb c aaaa bbbb ",还将执行s[n]=string[sum];
这个不是你所要的。另外还少了个 "s[n]='\0';"。
陈思有 2011-03-10
  • 打赏
  • 举报
回复
;(string[sum]!='\0')||(string[sum]!=' ');
这个问题在哪里
千杯不醉-sen 2011-03-09
  • 打赏
  • 举报
回复
曾经写过一个:

#include <stdio.h>
#include <string.h>
#include <ctype.h>
#define M 100
#define N 300
#define L 20

void main()
{
int i,j,k,m,len,number,word,max,a[L];
char words[M][L],string[N];
number = word = max = 0;
k = m = 0;
puts("请输入一段英文短文:");
gets(string);
len = strlen(string);
for (i=0; i<=number && j!=len+2; i++)
{
for (j=m; j<=len+1; j++)
{
if ( !(isalpha(string[j])) )
{
string[j] = ' ';
}
if (string[j] == ' ')
{
if (word)
{
words[i][k] = '\0';
if (max < k-1)
{
max = k-1;
}
k = 0;
m ++;
number+=1;
word = 0;
break;
}
m++;
continue;
}
else
{
word = 1;
words[i][k++] = string[j];
m++;
}
}
}
printf("共有%d个单词.\n",number);
puts("最长的为:");
for (i=0; i<number; i++)
{
if (a[i] == max)
{
puts(words[i]);
}
}
}
masmaster 2011-03-09
  • 打赏
  • 举报
回复
菜鸟,只有学习。。。
witwolf 2011-03-09
  • 打赏
  • 举报
回复
and then ?

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧