关于链表中,使用格式化输入的问题,高手帮解决下,感激!
鄙人是新手,问题或许幼稚,请不要耻笑。。。。
问题描述:最近用C语言写一个链表,出现了一个奇怪的问题,当假设链表只有一个头结点,且不存任何数据,我在插入两个结点放在头结点后,当我对结点数据进行初始化的时候,只有第一个结点可以,第二个结点写不进去值。具体输入函数如下:
int indata(CLIST *head)//CLIST为一个结构提,存放一个char和int数据
{
int i;
CLIST *p = NULL;
p = head-> next;
printf( "input numbers: ");
while(p != NULL)
{
scanf( "%c,%d ",&p-> name,&p-> num);//问题在这句,如果把c%换成%d问题就不存在了,或者把name声明为数组也可以解决问题
if(p-> next == NULL)
break;
p = p-> next;
}
return SUCCESS;
}
/*结构提定义如下*/
typedef struct clist
{
char name;
int num;
struct clist *next;
}CLIST;
此链表的连接绝对没有问题,我测试过N次了。。
请教各位,为什么在这里会出问题,如何解决,感激不尽~~~
[解决办法]
scanf( "%c,%d ",&p-> name,&p-> num);//问题在这句,如果把c%换成%d问题就不存在了,或者把name声明为数组也可以解决问题
------------------------------------
这个问题我以前也遇到过。
不过千万不要用在scanf( "%c,%d ",&p-> name,&p-> num)加 fflush(stdin)这种方法,c99里面只规定了fflush(stdout)这种方法,虽然你在VC下编译用fflush(stdin)也可以解决问题,但是你这个程序放到gcc上就要出错,因为它不知道fflush(stdin)是什么东东,因为c99标准里面根本就没有fflush(stdin)。fflush(stdin)只是在一些编译器下被默认了。而在支持c99的编译器里就会出错。
在这有两个解决方法:
第一:在scanf( "%c,%d ",&p-> name,&p-> num)前面加一个getchar();用来吃掉多余的那个字符(一般是回车符号)。
第二:在scanf( "%c,%d ",&p-> name,&p-> num)前加一个循环语句,
while (getchar () != '\n ')
{
; // 注意这有一个分好
}
作用是吃掉多余的所有字符。