解题思路:
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、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复