解题思路:
1.为何要用fgets?以及fgets的用法:
fgets(buf,MAXN,fin)将从fin(可以是stdin)中读取完整的一行放在字符数组buf中。你应当保证buf足够存放下文件的一行内容。除了在文件结束前没有遇到'\n'这种特殊情况外,buf总是以'\n'结尾。当一个字符都没有读到时,fgets返回NULL。
和fgetc一样,fgets也有一个“标准输入版”gets。遗憾的是,gets和它的兄弟fgets差别比较大:它的用法是gets(s),没有指明读取的最大字符数。这里就出现了一个潜在的问题:gets将不停地往s里塞东西,而不管塞不塞得下!————摘自《算法竞赛入门经典》(刘汝佳 编著)
2.strtok的用法(需要#include<string.h>)
char s[]="我是用单个字符作为分隔符隔开的";
char *t;
t=strtok(s,"单个字符作为分隔符");//由分隔符分开的第一个子串t
while(t){
//处理当前获取到的子串t
t=strtok(NULL,"单个字符作为分隔符");//由分隔符分开的下一个子串t
}注意事项:
在读取了完整一行字符串后,若最后一字符为'\n',它会无形地增大最后一个单词的长度。
例如,输入“I am a student of website”,回车输入之后,运行程序,结果是“website”并且后有一空行,这里的最长单词被误判为长度8,而不是我们所看到的长度7,而且应输出先出现的“student”,却不是“website”。
所以,在分解单词之前,就应该找到所获取字符串的最后一位,若为'\n'就换成字符串结束符'\0'。
参考代码:
#include<stdio.h>
#include<string.h>
#define N 200000
char s[N];
int main(){
int l,m;
char *t,*w;
if(NULL!=fgets(s,N,stdin)){
l=strlen(s);
if(s[l-1]=='\n') s[l-1]='\0';//保证串内没有无关字符
m=0;
t=strtok(s," ");
while(t){
l=strlen(t);
if(l>m){//若有更长串
m=l;//更新最长串的长度
w=t;//记录最长串的首地址
}
t=strtok(NULL," ");
}
puts(w);
}
return 0;
}0.0分
2 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复