feof()与strtok()退出循环体的注意事项

本文探讨了在C语言中使用feof与strtok函数时容易遇到的问题。详细解释了feof并非在读取完整个文件后立即返回非零值,而是在尝试读取下一个不存在的内容时才返回非零值。此外,还讨论了strtok在处理字符串时的行为特点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天在进行单步调试时才发现,原来feof是在读取完文件内容之后的下一次读取时才能发现文件已经终止,以前一直以为是读取完文件内容后就遇到了文件结束符EOF,自然终止了。

比如有这个一个文件a.txt

 

 

 

while((t=feof(fp)) == 0)

{

      fgets(line,1024,fp);

     ……

 }

注:fp是打开的文件指针,t是int,line是一个长度1024的char数组

第一次循环,t==0,读取完一行时,已经把文件内容全部读取,执行完循环体,再次判断循环条件时,t依然会等于0,继续执行循环体,回来再次判断循环条件,这时t才等于1,才退出循环。

如果没注意到这一点而循环体里面有对读取内容的某些操作很可能会产生段错误。

比如在fgets(line,1024,fp);后面有下面语句的话

 

p = strchr(line,(int)'/n');

 *p = '/0';

这里是想去掉读取到的一行中的‘/n'。第二次执行循环体时因为实际上没有读取到新的一行,p会是NULL,而对p赋值就会产生了对内存的非法操作,段错误。

 

 

========================

strtok在截取完全部字符串后并没有马上退出循环,也是再多执行了一次循环体后才能发现读取完了

 

word = strtok(line," ");

 

while(word != NULL)

{

word = strtok(NULL," ");//get a word of the line

printf("word:%s/n",word);

}

 

 

执行结果是:(line中已经去掉'/n')

basketball

the

nba

(null)

在读出"nba"后,word不为NULL,继续执行循环体,之后word才会等于NULL,退出循环。

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值