这段代码有错吗?(关于 scanf)[已解决!!]
这段代码:无法输出"pass "(也就是无法达到printf("pass")这段代码就退出了)
#include <stdio.h>
#include <math.h>
#define abs(a) (a)>0?(a):-(a);
struct a{
int i;
float f;
};
main()
{
struct a *pa;
pa=(struct a*)malloc(sizeof(struct a));
scanf("%d",&pa->i);
printf("%d",pa->i);
getch();/*a pause*/
scanf("%f",&pa->f);
printf("pass?");
getch();
}
[ 本帖最后由 iptton 于 2006-6-16 01:48 编辑 ] 不知道为什么我VC里竟然说getch没有定义
用getchar代替会出现那个debug error,不知道是不是和楼主退出的原因一样? getch()只是在WINTC中用来看屏幕的。。。不是这个问题。。。
在VC中可以不要getch() 我用DEV_CPP来编译运行,一切正常啊! 用TC++3.0 和WINTC都有问题。。。
网上也有人问这个问题但没有答案。。。
主要是float的问题 只要是浮点类型的,在WINTC 和TC++3.0里都会出错
而改成INT型 则没有问题 发现这样竟然也会出错-_-!!!
main()
{
float f;
scanf("%f",&f);
} 楼上的,你的没有错呀。
我试过的。。。在WINTC 和 TC++3.0下都不会有错…… 是编译器的问题:
引用自:
http://www.stu-shop.com/post/c-scanf.html
问题一: 程序编译通过,但运行错误提示如下:
scanf : floating point formats not linked
Abnormal program termination
出错示例程序:
#include <stdio.h>
int main(void)
{
int i,j ;
float s;
/*这里*/
for(i=0;i<3;i++)
for(j=0;j<3;j++)
scanf("%f",&s);
for(i=0;i<3;i++)
for(j=0;j<3;j++)
printf("%f",s);
}
这实际上是个与本文主题无关的问题,也是与scanf()函数无关,是编译器的问题。
原因很明确:没有链接浮点库。早期系统内存资源紧张,多维浮点数组占用内存量大(一维浮点数组就没有此问题),因此TC在编译时尽量不加入无关的部分,在没发现需要浮点转换程序时,就不在可执行程序中安装这个部分。而有时TC又不能正确识别实际上确实需要做浮点转换,因此就会出现上面错误。
解决的方法:告诉TC需要做浮点数的输入转换。将以下语句加入上面程序中标有/*这里*/处。
方法一:
float c;
scanf("%f",&c);
方法二:
float c,*t;
t=&c;
.....
也就是说,编译器只要有浮点转换的线索,TC就会把浮点转换连上,所以一般大一点的程序里的就会有浮点变量反而没有此问题。
但问题到此并没结束,我在上面有句“一维浮点数组就没有此问题”,那么我们来看看这样行不行:
#include <stdio.h>
int main(void)
{
int i,j ;
float s,*ptr;
ptr=&s;
for(i=0;i<3;i++)
for(j=0;j<3;j++)
scanf("%f",ptr+i*3+j);
for(i=0;i<3;i++)
for(j=0;j<3;j++)
printf("%7.2f\n",s);
}
这样我们就把多维浮点数组降为一维浮点数组来处理,调试一下,程序运行正常。这说明TC编译器仅在处理多维浮点数组(结构体)有此“未链接浮点库”的问题。
[ 本帖最后由 iptton 于 2006-6-16 01:23 编辑 ] 原来是这么回事,还没遇到过. 有这样的情况呀,没有遇到过呢。用gcc编译楼主的代码没有问题。
页:
[1]