LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1096|回复: 11

一个c语言的小问题,有兴趣的可以看看

[复制链接]
发表于 2004-10-30 00:37:29 | 显示全部楼层 |阅读模式
有如下一段代码

  1. #include "stdio.h"
  2. int main()
  3. {
  4.         FILE *fp;
  5.         fp = fopen("tmpfile", "rb");
  6.        
  7.         char *tmpStr = (char*)malloc(50);       
  8.         while( !feof(fp) )
  9.         {
  10.                 fscanf(fp, "%s", tmpStr);
  11.                 printf("str: %s\n", tmpStr);
  12.         }
  13.         fclose(fp);
  14. }
复制代码

文件tmpfile的内容只有一行为:
china mother bee
程序的输出为:
str: china
str: mother
str: bee
str: bee

把程序稍稍改变一下

  1. #include "stdio.h"
  2. int main()
  3. {
  4.         FILE *fp;
  5.         fp = fopen("tmpfile", "rb");       
  6.        
  7.         while( !feof(fp) )
  8.         {
  9.                 char *tmpStr = (char*)malloc(50);       
  10.                 fscanf(fp, "%s", tmpStr);
  11.                 printf("str: %s\n", tmpStr);
  12.         }
  13.         fclose(fp);
  14. }
复制代码

此时程序的输出为
str: china
str: mother
str: bee
str:

不知道哪位能解释一下?
发表于 2004-10-30 09:51:36 | 显示全部楼层
你系统的问题
我的两个输出都一样
发表于 2004-10-30 11:39:51 | 显示全部楼层
我的系统上也没有问题。
发表于 2004-10-30 12:29:35 | 显示全部楼层

回复: 一个c语言的小问题,有兴趣的可以看看

最初由 bbcxiaoke 发表
有如下一段代码

  1. #include "stdio.h"
  2. int main()
  3. {
  4.         FILE *fp;
  5.         fp = fopen("tmpfile", "rb");
  6.        
  7.         char *tmpStr = (char*)malloc(50);       
  8.         while( !feof(fp) )
  9.         {
  10.                 fscanf(fp, "%s", tmpStr);
  11.                 printf("str: %s\n", tmpStr);
  12.         }
  13.         fclose(fp);
  14. }
复制代码

文件tmpfile的内容只有一行为:
china mother bee
程序的输出为:
str: china
str: mother
str: bee
str: bee

把程序稍稍改变一下

  1. #include "stdio.h"
  2. int main()
  3. {
  4.         FILE *fp;
  5.         fp = fopen("tmpfile", "rb");       
  6.        
  7.         while( !feof(fp) )
  8.         {
  9.                 char *tmpStr = (char*)malloc(50);       
  10.                 fscanf(fp, "%s", tmpStr);
  11.                 printf("str: %s\n", tmpStr);
  12.         }
  13.         fclose(fp);
  14. }
复制代码

此时程序的输出为
str: china
str: mother
str: bee
str:

不知道哪位能解释一下?

这两个程序都不好
首先:include系统的头文件最好用<>
其次:申请了空间但是没有释放。
发表于 2004-10-30 15:35:43 | 显示全部楼层
最后一步fscanf返回-1,这时读到EOF,而前面那个feof(fp)测试时还未到EOF,所以会有所不同
发表于 2004-11-3 22:57:51 | 显示全部楼层
建议这样改

  1. #include <stdio.h>
  2. int main()
  3. {
  4.         FILE *fp;
  5.         fp = fopen("tmpfile", "rb");
  6.        
  7.         char *tmpStr = (char*)malloc(50);
  8.         while( fscanf(fp, "%s", tmpStr)!=-1 )
  9.         {                       
  10.                 printf("str: %s\n", tmpStr);
  11.         }
  12.         fclose(fp);
  13.         free(tmpStr);
  14. }
复制代码
发表于 2004-11-4 09:22:55 | 显示全部楼层

fscanf这样的函数使用最好小心

上面的程序,很容易用一个长一点的字符串就可以让程序缓冲区溢出

个人觉得最好不要用scanf/fscanf等函数
发表于 2004-11-4 12:24:14 | 显示全部楼层
scanf/fscanf没听说过有缓冲溢出。好像是getxxx可能。
楼上介绍一个例子`谢谢
发表于 2004-11-4 13:14:23 | 显示全部楼层

这样的程序很难写么?

[wbj@server2 src]$ cat ex24.c
#include <stdio.h>

int main(int argc, char* argv[])
{
        char buf[32] = {0,};

        scanf("%s", buf);

        printf("%s\n", buf);

        return 0;
}

[wbj@server2 src]$ make ex24
gcc -g -O2 -Wall -Wstrict-prototypes -I. -I ~/ds/include -L ~/ds/lib -D_GNU_SOURCE    ex24.c   -o ex24
[wbj@server2 src]$ ./ex24
asdf
asdf
[wbj@server2 src]$ ./ex24
asjdklfjalsk;djfkl;asjdkl;fjalsk;djfl;kajdakljsdklf
asjdklfjalsk;djfkl;asjdkl;fjalsk;djfl;kajdakljsdklf
段错误
[wbj@server2 src]$
发表于 2004-11-4 16:44:55 | 显示全部楼层
都段错误了 还溢出什么啊~~!!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表