回 帖 发 新 帖 刷新版面

主题:[讨论]关于scanf

/*建立动态链表*/
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
//#define NULL 0
#define LEN sizeof(struct student)
struct student
{long num;
 float score;
 struct student *next;
};
int n;
struct student *creat()
{
       struct student *head;
       struct student *p1,*p2;
       n=0;
       p1=p2=(struct student*)malloc(LEN);
       scanf("%d%f",&p1->num,&p1->score);getchar();
       head=NULL;
       while(p1->num!=0)
       {
                        n=n+1;
                        if(n==1)head=p1;
                        else p2->next=p1;
                        p2=p1;
                        p1=(struct student*)malloc(LEN);
                        scanf("%id%f",&p1->num,&p1->score);//getchar();//这里为什么会有错,而将这一行改成下一行就没错了呢?
                        //scanf("%d",&p1->num);scanf("%f",&p1->score);
                        }
          p2->next=NULL;
         return (head);     
}
//输出动态链表
void print(struct student *head) 
{
     struct student *p;
     printf("\nNow,these is %d records are:\n",n); 
     p=head;
     if(head!=NULL)
     do
     {
                   printf("%ld  %.lf\n",p->num,p->score);
                   p=p->next;
                   }while(p!=NULL);
}                         
int main()
{
    struct student *stu;
    stu=creat();
    print(stu);
    system("PAUSE");
    return 0;
}
             
                   

回复列表 (共3个回复)

沙发

scanf("%id%f",&p1->num,&p1->score);//getchar();//这里为什么会有错,而将这一行改成下一行就没错了呢?

%id%f 这里是多了 i 还是多了 d ? 如果不是像这样输入 23d 456.5的话很有可能进入死循环。%i 对应的数后面必须得输入一个d,不能有空格。
还有不是十分必要,最好不要用%i这样的格式,好像这个用得很少。

板凳

猜想%id是手误,实际上是想用%ld:)

3 楼

[quote]猜想%id是手误,实际上是想用%ld:)[/quote]
看到那个结构体里面的成员是long类型,看样子应该是手误。

我开始还以为 有可能根据不同要求需要输入8禁制,10进制或者16进制呢。

我来回复

您尚未登录,请登录后再回复。点此登录或注册