mrm200x 发表于 2008-3-22 20:17

【求助】关于c语言结构链表的一个严重程序问题

#include "stdio.h"
typedef struct num{
char data;
struct num *next;}node;

void main(){
node *list;
list=(node *)malloc(sizeof(node));
printf("put first");
scanf("%c",&list->data);
printf("%c",list->data);}
大家帮忙看看啊,第一个程序是输出输入list->data
没有问题可是如果在他中间加入一段语句后变为
#include "stdio.h"
typedef struct num{
char data;
struct num *next;}node;

void main(){
node *list;
int j; *
printf("put all"); *
scanf("%d",&j); *
printf("%d",j); *

list=(node *)malloc(sizeof(node));
if(!list)
printf("error");
printf("put first");
scanf("%c",&list->data);
printf("%c",list->data);}
程序执行到list=(node*)...前就会跳出,请问各位大人这是为什么呢。。。望赐教

henvelleng 发表于 2008-3-22 21:48

调试的时候不要用scanf,头文件不全,还有malloc已经不需要强制转换了,不过这些似乎都不是问题所在……:sweat:

mrm200x 发表于 2008-3-23 01:00

正解在此

因为你的data是char型的,当执行到scanf(\"%d\",&j)时,你会按回车键,在windows系统中,按下enter后,会产生回车和换行的效果,所以你的第二个scanf(\"%c\",&list->data),实际上已经完成了,输入的就是换行。printf(\"%c\",list->data)也会执行,执行后就换行了。执行程序后看到\"Press any key to continue\"在新的一行就是最好的证明。所以用scanf接收键盘输入字符时要小心,应该要清空输入缓冲区,用fflush(stdin)就可以达到这一效果。要改的话,可以把data改成int型,或是在scanf(\"%c\",&list->data)前加上一个getchar(),这时getchar()就接收了回车,还有就是用刚才说的fflush(stdin)也可以。然后就会正确执行scanf(\"%c\",&list->data)了。

ayako1986 发表于 2008-3-23 03:13

分开看都能看懂 放一起就不行了

果然是没程序猿命:awkward:

EVA1 发表于 2008-3-23 09:58

原帖由 mrm200x 于 2008-3-23 01:00 发表 http://bbs.saraba1st.com/images/common/back.gif
执行程序后看到\"Press any key to continue\"在新的一行就是最好的证明。
用VC++6?程序结束后会自动换行才怪。

程序在VC++内部运行时Press any key to continue都紧跟在最后输出字符之后除非人工加\\n换行。

p.s:两个scanf间加个getch()就好。

[ 本帖最后由 EVA1 于 2008-3-23 09:59 编辑 ]
页: [1]
查看完整版本: 【求助】关于c语言结构链表的一个严重程序问题