求解惑,关于long和unsigned long。。。
今天早上看见有人求图书馆管理程序的,就动手帮写了下,编译顺利通过了,可是却不能正常输出,没办法,排错弄了一白天,最后发现是数据类型的问题,代码如下程序代码:
#include<stdio.h> #include<stdlib.h> #include<string.h> typedef struct Book{ unsigned long num; //就是这里出问题了,匪夷所思啊 char name[30]; char author[30]; struct Book *next; }book; // 定义结构体 book * make(book *head){ book *p,*q; //制作链表节点函数 p=(book *)malloc(sizeof(book)); printf("enter num:"); fflush(stdin); scanf("%d",&p->num); fflush(stdin); printf("enter name:"); gets(p->name); printf("enter author:"); gets(p->author); p->next=NULL; if(head==NULL){head=p;return head;}//如果链表是第一次建立,即链表原来无内容 else {q=head; while(q->next)q=q->next;//链表原来有内容 q->next=p;return head;} } book * find(book *head,char *s){//查找函数 book *p; p=head; while(p){ if(!(strcmp(s,p->name)))return p;//将字符串与链表内容比对,如一样,返回该节点指针 p=p->next; } return NULL;//如比对结果都不一样,返回空指针 } book * del(book *head,book *p){//删除节点函数 book *q; q=head; if(p==head){ q=head;head=head->next;//如果删除的是头节点,返回新的头指针 free(q);return head;} while(q->next!=p){q=q->next;continue;}//将q指向p的前一个节点 q->next=p->next; free(p);return head;} book * mod(book *head,book *p){//修改节点函数 while(head==p)continue; printf("enter num"); scanf("%d",&p->num); printf("enter name"); scanf("%s",p->name); printf("enter author"); scanf("%s",p->author); return head;} void xianshi(book *p){//显示全部函数 while(p){ printf("No.:%d\nname:%s\nauthor:%s\n\n",p->num,p->name,p->author); p=p->next;}} main(){ int x,i,j; book *head=NULL,*p; char s1[30]; for(;;){ printf("=============enter what=================\n"); printf("\t1:enter book.\n\t2:search book.\n\t3:delete book.\n\t4:modify book.\n\t5:xianshi\n"); printf("========================================\n"); fflush(stdin); scanf("%d",&x); switch(x){ case 1:head=make(head);break;//建立节点 case 2: case 3: case 4:if(head==NULL){printf("no have any book!\n");break;} printf("whitch book");fflush(stdin); scanf("%s",s1);p=find(head,s1); if(x==2)if(p)printf("NO.:%d\nname:%s\nautor:%s\n",p->num,p->name,p->author); else printf("no find"); if(x==3)head=del(head,p); if(x==4)head=mod(head,p); break; case 5:xianshi(head);break; default:printf("error"); } printf("===========还有事吗?============="); printf("\n\t1:有. 0:没有\n========================================\n"); fflush(stdin); scanf("%d",&x); if(!x)break; } }原来我想书要是很多的话,int型不够就用的unsigned long,测试时也用的长整数(7,8位都),这样就发现输出的编号都不是我输入的数字。起初根本没想到类型的问题,到后来才发现不论我定义int还是unsigned long都只能输入5位数,可是我翻遍数都是unsigned有效位是十位啊,为什么我输入6位就不行了呢??求解惑??