鱼C论坛

 找回密码
 立即注册
查看: 5062|回复: 7

为什么输出两个啊?

[复制链接]
发表于 2012-2-23 09:56:09 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
先看源码:

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>

  4. #define LEN sizeof(node)
  5. #define NULL 0

  6. typedef struct LNode
  7. {
  8.   char data[6];
  9.   struct LNode * next;
  10. }node;

  11. node * createlist()
  12. {
  13.   node *p = (node *)malloc(LEN), *head;
  14.   head = p;
  15.   printf("请输入字符串:");
  16.   scanf("%s", p->data);
  17.   head->next = NULL;

  18.   while(strcmp(p->data, "A"))
  19.   {
  20.     p = (node *)malloc(LEN);
  21.     printf("请输入字符串:");
  22.     gets(p->data);
  23.     p->next = head;
  24.     head = p;
  25.   }
  26.   head = p->next;
  27.   free(p);

  28.   return head;
  29. }

  30. void showlist(node * head)
  31. {
  32.   node * p = head;
  33.   while(p != NULL)
  34.   {
  35.     printf("%s ", p->data);
  36.     p = p->next;
  37.   }
  38.   puts("\n");
  39. }

  40. void main()
  41. {
  42.   node * head;
  43.   head = createlist();
  44.   showlist(head);
  45. }
复制代码
再看结果:
请输入字符串:ZHAO
请输入字符串:请输入字符串:QIAN
请输入字符串:SUN
请输入字符串:LI
请输入字符串:ZHOU
请输入字符串:WU
请输入字符串:ZHENG
请输入字符串:WANG
请输入字符串:A
WANG  ZHENG  WU  ZHOU  LI  SUN  QIAN    ZHAO
Press any key to continue
为什么QIAN之前会出现两个“请输入字符串”啊?

小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-2-26 09:05:56 | 显示全部楼层
你这前插看起来好别扭啊  
你要不就全用scanf 或者全用gets就不会出现这个问题了
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-3-14 14:13:36 | 显示全部楼层
gets是最低级的漏洞..
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-4-17 05:08:53 | 显示全部楼层

这个我知道啊,可我就是不明白为什么这样就会有两个输出啊
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-4-17 05:09:49 | 显示全部楼层
ccqiji 发表于 2012-3-14 14:13
gets是最低级的漏洞..

能说明白点吗?这个实在不太懂啊!大哥!
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-4-20 08:56:28 | 显示全部楼层
解决方法:请在26行:gets(p->data);前加一句:fflush(stdin);即可
原因说明:gets是从输入缓冲区获取数据,代码执行到19行时,会输入数据,之后导致输入缓冲区不为空,所以接下来使用gets函数时,该函数尝试从输入缓冲区获取数据,结果是成功获取到数据,故不会等待用户输入而继续循环,导致。。。
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-4-21 09:56:13 | 显示全部楼层
6楼说的基本正确,就是缓冲区的问题,导致你第一次进while循环的时候,gets函数默认有数据,而这个数据是第一次输入时候 的‘\n’回车,被gets接收了,所以会略过gets函数的输入,而进行下一次循环,也就是输出了两次那个 “请输入字符串”

还有一个问题,就是楼主你应该要学会设置break断点,通过调试来发现,各个变量的变化,进而发现错误,因为这种错误完全有能力自己调试出来。
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2016-2-5 13:49:43 | 显示全部楼层
路过,努力学习!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-5-13 11:58

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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