解题思路:
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分
5 人评分
1. 每个单词间用一个空格隔开。 单词仅由小写字母组成。 所有单词的长度和不超过100000, 那么假设每个单词只有一个字符, 加上其间的空格, 输入串最长不超过200000 2. char *strtok(char s[], const char *delim); s为要分解的字符, delim为分隔符字符, 如果传入字符串作为delim, 则传入的字符串中每个字符均为分割符。 首次调用时, s指向要分解的字符串, 之后再次调用要把s设成NULL。 以上内容转载自: https://baike.so.com/doc/6778473-6994570.html 3. 有没有合适的函数能够代替strtok呢? 有的,它就是strtok_r。 strtok_r是linux平台下的strtok函数的线程安全版。 以上内容转载自: http://www.cnblogs.com/lixiaohui-ambition/archive/2012/07/18/2598042.html 4. 今天看了看strtok函数, 特意找了下Linux内核2.0.1版本的代码, 因为在更高版本(至少2.6)已经使用strsep替换了该函数。 以上内容转载自: https://blog.csdn.net/ljq32/article/details/51484154
C语言程序设计教程(第三版)课后习题8.8 (C语言代码)浏览:572 |
数列排序 (C语言代码)浏览:828 |
C语言程序设计教程(第三版)课后习题9.8 (Java代码)浏览:1636 |
C语言程序设计教程(第三版)课后习题8.1 (C语言代码)浏览:438 |
C语言程序设计教程(第三版)课后习题10.7 (C语言代码)浏览:958 |
C语言程序设计教程(第三版)课后习题8.2 (C语言代码)浏览:5228 |
WU-格式化数据输出 (C++代码)浏览:1194 |
【求[X,Y]内被除3余1并且被除5余3的整数的和】 (C语言代码)浏览:672 |
蛇行矩阵 (C语言代码)浏览:524 |
罗列完美数 (C语言代码)浏览:491 |