左嘉


私信TA

用户名:zuojia

访问量:88641

签 名:

Jz

等  级
排  名 5
经  验 34540
参赛次数 226
文章发表 72
年  龄 40
在职情况 在职
学  校 北京理工大学
专  业

  自我简介:

解题思路:
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
2018-07-15 08:13:21
  • «
  • 1
  • »