找回密码
 立即注册
搜索
查看: 1786|回复: 4

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

[复制链接]
发表于 2008-3-22 20:17 | 显示全部楼层 |阅读模式
#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*)...前就会跳出,请问各位大人这是为什么呢。。。望赐教
回复

使用道具 举报

     
发表于 2008-3-22 21:48 | 显示全部楼层
调试的时候不要用scanf,头文件不全,还有malloc已经不需要强制转换了,不过这些似乎都不是问题所在……:sweat:
回复

使用道具 举报

 楼主| 发表于 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)了。
回复

使用道具 举报

发表于 2008-3-23 03:13 | 显示全部楼层
分开看都能看懂 放一起就不行了

果然是没程序猿命:awkward:
回复

使用道具 举报

发表于 2008-3-23 09:58 | 显示全部楼层
原帖由 mrm200x 于 2008-3-23 01:00 发表
执行程序后看到\"Press any key to continue\"在新的一行就是最好的证明。

用VC++6?程序结束后会自动换行才怪。

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

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

[ 本帖最后由 EVA1 于 2008-3-23 09:59 编辑 ]
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|上海互联网违法和不良信息举报中心|网上有害信息举报专区|962110 反电信诈骗|举报电话 021-62035905|Stage1st ( 沪ICP备13020230号-1|沪公网安备 31010702007642号 )

GMT+8, 2025-7-20 01:20 , Processed in 0.038035 second(s), 7 queries , Gzip On, Redis On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表