C语言最长最短单词

题目:最长最短单词

【描述】
输入1行句子(不多于200个单词,每个单词长度不超过100),只包含字母、空格和逗号。单词由至少一个连续的字母构成,空格逗号都是单词间的间隔。
试输出第1个最长的单词和第1个最短单词。

【输入】
一行句子。

【输出】
两行输出:
第1行,第一个最长的单词。
第2行,第一个最短的单词。

【样例输入】
I am studying Programming language C in Peking University
【样例输出】
Programming
I

分析:

这个题目思路是这样:先用gets函数输入整行字符串a,然后扫描a串分割出各个单词,依次比较新分割的单词的长度是否比已经发现的单词中最长、最短单词还要长或短,若是有需要在更新一经发现的最长、最短单词并更新最长、最短单词的长度。
这里关键是扫描、分割单词。由于空格和逗号都是单词的分隔符号,所以可以把他们两种符号一起处理。扫描分割的过程需要用标志性变量f。f=0表示当前遇到的分隔符(空格或逗号)是新单词之前的分隔符; f=1表示当前遇到的分隔符前面有一个刚刚扫描形成的单词,也就是已经扫描分割出一个单词,需要对该单词做处理(求长度newLen,用newLen和max、min比较)。注意:在处理完一个单词后需要把f重新设为0.

注意1:输入的串的开头、结尾可能有分隔符,也可能没有分隔符。所以末尾单词不一定被拿来跟max和min作比较。需要在循环后单独处理。

注意2:如果所有单词长度相同,那么第一个单词既是最长单词也是最短单词。

代码
#include<stdio.h>
#include<string.h>
int main(void){
	char a[20200],b[101],maxT[101]="",minT[101]="";
	int i=0,j=0;
	int max=-1,min=101,newLen;
	int f=0;  //f=0表示当前遇到的分隔符(空格或逗号)是新单词前的分隔符 
	
	gets(a);
	while(a[i]!='\0'){  //扫描a串生成一个新的单词,然后测其长度,再与max,min对比 
		if(a[i]==' '||a[i]==','){
			if(f==1){   //f=1表示当前遇到的分隔符前面有一个刚刚扫描形成的单词 
				b[j]='\0';
				newLen=strlen(b);
				if(newLen>max) {
					max=newLen;
					strcpy(maxT,b);
				}
				if(newLen<min){
					min=newLen;
					strcpy(minT,b);
				}
				f=0;
				j=0;
			}
		}
		else{
			b[j]=a[i];
			j++;
			f=1;  //开始或是正在构造一个单词 
		}
		i++;
	}
	//处理末尾单词 
	b[j]='\0';
	newLen=strlen(b);
	if(newLen>max) {
		max=newLen;
		strcpy(maxT,b);
	}
	if(newLen<min){
		min=newLen;
		strcpy(minT,b);
	}
	printf("%s\n%s\n",maxT,minT);
	return 0;
}
运行

在这里插入图片描述
在这里插入图片描述
原作者博客
https://www.cnblogs.com/huashanqingzhu/p/5075332.html

  • 26
    点赞
  • 67
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值