工大后院

 找回密码
 加入后院

扫一扫,访问微社区

QQ登录

只需一步,快速开始

搜索
查看: 3032|回复: 9

这段代码有错吗?(关于 scanf)[已解决!!]

[复制链接]
发表于 2006-6-15 23:20 | 显示全部楼层 |阅读模式
这段代码:
无法输出"pass "(也就是无法达到printf("pass")这段代码就退出了)

  1. #include <stdio.h>
  2. #include <math.h>
  3. #define abs(a) (a)>0?(a):-(a);
  4. struct a{
  5.   int i;
  6.   float f;
  7. };
  8. main()
  9. {
  10.   struct a *pa;
  11.   pa=(struct a*)malloc(sizeof(struct a));
  12.   scanf("%d",&pa->i);
  13.   printf("%d",pa->i);
  14.   getch();/*a pause*/
  15.   scanf("%f",&pa->f);
  16.   printf("pass?");
  17.   getch();
  18. }
复制代码

[ 本帖最后由 iptton 于 2006-6-16 01:48 编辑 ]
发表于 2006-6-15 23:58 | 显示全部楼层
不知道为什么我VC里竟然说getch没有定义
用getchar代替会出现那个debug error,不知道是不是和楼主退出的原因一样?
回复

使用道具 举报

 楼主| 发表于 2006-6-16 00:13 | 显示全部楼层
getch()只是在WINTC中用来看屏幕的。。。不是这个问题。。。

在VC中可以不要getch()
回复

使用道具 举报

发表于 2006-6-16 00:26 | 显示全部楼层
我用DEV_CPP来编译运行,一切正常啊!
回复

使用道具 举报

 楼主| 发表于 2006-6-16 00:29 | 显示全部楼层
用TC++3.0 和WINTC都有问题。。。

网上也有人问这个问题  但没有答案。。。

主要是float的问题   只要是浮点类型的,在WINTC 和TC++3.0里都会出错

而改成INT型 则没有问题
回复

使用道具 举报

发表于 2006-6-16 00:30 | 显示全部楼层
发现这样竟然也会出错-_-!!!
main()
{
        float f;
        scanf("%f",&f);
}
回复

使用道具 举报

 楼主| 发表于 2006-6-16 00:33 | 显示全部楼层
楼上的,你的没有错呀。

我试过的。。。在WINTC 和 TC++3.0下都不会有错……
回复

使用道具 举报

 楼主| 发表于 2006-6-16 01:21 | 显示全部楼层
是编译器的问题:
引用自:
http://www.stu-shop.com/post/c-scanf.html

问题一: 程序编译通过,但运行错误提示如下:
scanf : floating point formats not linked
Abnormal program termination

出错示例程序:

  1. #include <stdio.h>
  2. int main(void)
  3. {
  4. int i,j ;
  5. float s[3][3];

  6. /*这里*/

  7. for(i=0;i<3;i++)
  8. for(j=0;j<3;j++)
  9. scanf("%f",&s[i][j]);

  10. for(i=0;i<3;i++)
  11. for(j=0;j<3;j++)
  12. printf("%f",s[i][j]);
  13. }
复制代码

这实际上是个与本文主题无关的问题,也是与scanf()函数无关,是编译器的问题。

原因很明确:没有链接浮点库。早期系统内存资源紧张,多维浮点数组占用内存量大(一维浮点数组就没有此问题),因此TC在编译时尽量不加入无关的部分,在没发现需要浮点转换程序时,就不在可执行程序中安装这个部分。而有时TC又不能正确识别实际上确实需要做浮点转换,因此就会出现上面错误。

解决的方法:告诉TC需要做浮点数的输入转换。将以下语句加入上面程序中标有/*这里*/处。

方法一:
  1. float c;
  2. scanf("%f",&c);
复制代码


方法二:
  1. float c,*t;

  2. t=&c;
  3. .....
复制代码


也就是说,编译器只要有浮点转换的线索,TC就会把浮点转换连上,所以一般大一点的程序里的就会有浮点变量反而没有此问题。

但问题到此并没结束,我在上面有句“一维浮点数组就没有此问题”,那么我们来看看这样行不行:

  1. #include <stdio.h>
  2. int main(void)
  3. {
  4. int i,j ;
  5. float s[3][3],*ptr;

  6. ptr=&s[0][0];


  7. for(i=0;i<3;i++)
  8. for(j=0;j<3;j++)
  9. scanf("%f",ptr+i*3+j);

  10. for(i=0;i<3;i++)
  11. for(j=0;j<3;j++)
  12. printf("%7.2f\n",s[i][j]);
  13. }
复制代码


这样我们就把多维浮点数组降为一维浮点数组来处理,调试一下,程序运行正常。这说明TC编译器仅在处理多维浮点数组(结构体)有此“未链接浮点库”的问题。

[ 本帖最后由 iptton 于 2006-6-16 01:23 编辑 ]
回复

使用道具 举报

发表于 2006-6-16 12:34 | 显示全部楼层
原来是这么回事,还没遇到过.
回复

使用道具 举报

发表于 2006-6-22 01:26 | 显示全部楼层
有这样的情况呀,没有遇到过呢。用gcc编译楼主的代码没有问题。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入后院

本版积分规则

QQ|Archiver|手机版|小黑屋|广告业务Q|工大后院 ( 粤ICP备10013660号 )

GMT+8, 2025-5-15 03:46

Powered by Discuz! X3.5

Copyright © 2001-2024 Tencent Cloud.

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