解题思路:
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语言代码)浏览:1330 |
WU-蓝桥杯算法提高VIP-企业奖金发放 (C++代码)浏览:1268 |
【简单计算】 (C语言代码)浏览:642 |
C语言程序设计教程(第三版)课后习题1.5 (C语言代码)浏览:701 |
C语言程序设计教程(第三版)课后习题9.3 (C语言代码)浏览:750 |
sizeof的大作用 (C语言代码)浏览:1138 |
用筛法求之N内的素数。 (C语言代码)浏览:595 |
C语言程序设计教程(第三版)课后习题5.4 (C语言代码)浏览:501 |
C语言程序设计教程(第三版)课后习题9.1 (C语言代码)浏览:653 |
C语言程序设计教程(第三版)课后习题7.4 (C语言代码)浏览:522 |