LinuxSir.cn,穿越时空的Linuxsir!

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

同样一段代码(很简单),VC和gcc编译运行出来的结果不一样。。。。。。

[复制链接]
发表于 2005-3-16 02:45:41 | 显示全部楼层 |阅读模式
测试了一段代码,在VC和gcc下结果不一样,VC下面还比较正常,gcc下面很诡异,不知道是什么问题。。。。。。

test.c:

  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. int main()
  4. {
  5.         FILE *file1;
  6.         int a, b, c;
  7.         char t;

  8.         file1 = fopen("testnum", "r");
  9.         fscanf(file1, "%d %d %[^\n]", &a, &b);
  10.         fscanf(file1, "%d %[^\n]", &c);
  11.         fscanf(file1, "%c", &t);
  12.         fclose(file1);

  13.         printf("%d %d %d %c\n", a, b, c, t);

  14.         return EXIT_SUCCESS;
  15. }
复制代码

testnum文件内容:
1 2 3
2 3 4
1234
2345

大家帮忙看看 :thank
发表于 2005-3-16 09:02:15 | 显示全部楼层
fcanf中的%[^\n]是什么意思?
回复 支持 反对

使用道具 举报

发表于 2005-3-16 11:08:35 | 显示全部楼层
字符不包含‘\n’的最长非空串,要求对应的参数为 char * 型。
回复 支持 反对

使用道具 举报

发表于 2005-3-16 13:10:08 | 显示全部楼层
在fscanf()中参数不够,或使用*.

  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. int
  4. main ()
  5. {
  6.   FILE *file1;
  7.   int a, b, c;
  8.   char t, tmp,  *e = &tmp; // tmp 纯粹为了初始化 e,还是用 * 较好。

  9.   file1 = fopen ("testnum", "r");
  10.   fscanf (file1, "%d %d %[^\n]", &a, &b, e);
  11.   fscanf (file1, "%d %[^\n]", &c, e);
  12.   fscanf (file1, "%c", &t);
  13.   fclose (file1);

  14.   printf ("a= %d b= %d c= %d t= %d\n", a, b, c, t);

  15.   return 0;
  16. }
复制代码

or

  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. int
  4. main ()
  5. {
  6.   FILE *file1;
  7.   int a, b, c;
  8.   char t;

  9.   file1 = fopen ("testnum", "r");
  10.   fscanf (file1, "%d %d %*[^\n]", &a, &b);
  11.   fscanf (file1, "%d %*[^\n]", &c);
  12.   fscanf (file1, "%c", &t);
  13.   fclose (file1);

  14.   printf ("a= %d b= %d c= %d t= %c\n", a, b, c, t);

  15.   return 0;
  16. }
复制代码
回复 支持 反对

使用道具 举报

发表于 2005-3-16 14:57:04 | 显示全部楼层
楼上的 char *e 要分配空间的,这样写如果不 Segmentation fault 纯属运气好。

问一下,%*是啥意思?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-3-16 19:17:55 | 显示全部楼层
Post by LieDang
在fscanf()中参数不够,或使用*.

  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. int
  4. main ()
  5. {
  6.   FILE *file1;
  7.   int a, b, c;
  8.   char t, *e;

  9.   file1 = fopen ("testnum", "r");
  10.   fscanf (file1, "%d %d %[^\n]", &a, &b, e);
  11.   fscanf (file1, "%d %[^\n]", &c, e);
  12.   fscanf (file1, "%c", &t);
  13.   fclose (file1);

  14.   printf ("a= %d b= %d c= %d t= %d\n", a, b, c, t);

  15.   return 0;
  16. }
复制代码

or

  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. int
  4. main ()
  5. {
  6.   FILE *file1;
  7.   int a, b, c;
  8.   char t;

  9.   file1 = fopen ("testnum", "r");
  10.   fscanf (file1, "%d %d %*[^\n]", &a, &b);
  11.   fscanf (file1, "%d %*[^\n]", &c);
  12.   fscanf (file1, "%c", &t);
  13.   fclose (file1);

  14.   printf ("a= %d b= %d c= %d t= %c\n", a, b, c, t);

  15.   return 0;
  16. }
复制代码


Thank you! :thank
呵呵,没有仔细看手册,看来gcc对c标准还是实现得很不错的。
补充一下,fscanf中加上%*[^\n]的目的是要直接跳到行末,不过后来发现还需要加一句%*[\n]把换行符也跳过去。我不知道有没有别的更好的办法实现读取文件中一行的一些参数,然后把其它的跳过去,所以只能用这样子实现。
那个东东因为是要跨平台的,所以vc和gcc都得测试一下,保证遵循C89(因为VC不符合C99,比较郁闷)
回复 支持 反对

使用道具 举报

发表于 2005-3-16 20:49:39 | 显示全部楼层
gcc也有win32版的
回复 支持 反对

使用道具 举报

发表于 2005-3-17 10:15:26 | 显示全部楼层
Post by kj501
fcanf中的%[^\n]是什么意思?

这让我想起了很久前的一个问题:仅用scanf以及sprintf系列的函数实现密码输入验证
比如密码必须是6位的数字,密码的前后可以有blank字符(即空格和tab),最终以
确认(\n)结束。
我试着这么写
char        passwd[8];
char        ch;
int           result = scanf("%*[ \t]%6[0-9]%*[ \t] %c", passwd, &ch);
if (result == 2 && ch == '\n') {
     /* validate passwd length */
}
else {
     /* invalid input */
}
后来发现不行,因为%*[ \t]要求至少有一个blank字符。控制字符(%)前面的' '(空格)
倒是可以匹配任意(包括没有)个space字符,但space字符包括回车字符。不知道大家
有没有解决方案?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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