floating point formats not linked的解决

谭浩强《C语言程序设计》里面有一个动态链表的输入和输出的例子,代码如下:

#include <stdio.h>
#include <conio.h>
#include <malloc.h>
#define   LEN   sizeof(struct   student)
struct student
{
    int num;
    float score;
    struct student   *next;
};
struct student *creat(void)
{
    int N=0;
    struct   student   *p1,*p2,*head;
    p1=p2=(struct   student   *)malloc(LEN);
    scanf("%d%f",&p1->num,&p1->score);
    head=0;
    while(p1->num!=0)
    {
          N++;
        if(N==1)   head=p1;
        else   p2->next=p1;
        p2=p1;
        p1=(struct   student   *)malloc(LEN);
        scanf("%d%f",&p1->num,&p1->score);
    }
    p2->next=0;
    return(head);
}

void   print(struct   student   *head)
{
    struct   student   *p;
    p=head;
    if(head!=0)
    do
    {
        printf("%d   %fn",p->num,p->score);
        p=p->next;
    }while(p!=0);
}
void main()
{
  struct   student   *head1;
  printf("input:n");
  head1=creat();
  printf("output:n");
  print(head1);
  getch();
}

用win-tc编译的时候,没有错误,可是运行的时候输入第二值后就自动关闭了,用Turbo C也一样,不过找到错误提示是scanf:floating point formats not linked. 到网上搜了搜错误原因是这样的:TC开发时(80年代)DOS下的存储资源紧缺,因此TC在编译时尽量不加入无关部分。在没发现需要做浮点转换时,就不将这个部分安装到可执行程序里。也就是说默认的情况下是不连接浮点库的,除非你需要他,这就造成了如果你没有调用浮点函数,而是直接用%f或别的形式在scanf()和peintf()里调用就会出现本例的错误——floating point formats not linked.
有两种解决办法:
1.声明一个float型的中间变量,读入,然后赋值给p->score。把第一个 scanf("%d,%f",&p->num,&p->score);
改为
float temp;
scanf("%f",&temp);
p->score = temp;

2.生明一个函数,不用调用它。
static void forcefloat(float *p)
{ float f = *p;
forcefloat(&f);
}

3.使用gcc或vc++编译器

Leave a Reply

Your email address will not be published. Required fields are marked *