阿飞 发表于 2012-2-23 09:56:09

为什么输出两个啊?

先看源码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#define LEN sizeof(node)
#define NULL 0

typedef struct LNode
{
char data;
struct LNode * next;
}node;

node * createlist()
{
node *p = (node *)malloc(LEN), *head;
head = p;
printf("请输入字符串:");
scanf("%s", p->data);
head->next = NULL;

while(strcmp(p->data, "A"))
{
    p = (node *)malloc(LEN);
    printf("请输入字符串:");
    gets(p->data);
    p->next = head;
    head = p;
}
head = p->next;
free(p);

return head;
}

void showlist(node * head)
{
node * p = head;
while(p != NULL)
{
    printf("%s ", p->data);
    p = p->next;
}
puts("\n");
}

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

紫炎 发表于 2012-2-26 09:05:56

你这前插看起来好别扭啊
你要不就全用scanf 或者全用gets就不会出现这个问题了

ccqiji 发表于 2012-3-14 14:13:36

gets是最低级的漏洞..

阿飞 发表于 2012-4-17 05:08:53

紫炎 发表于 2012-2-26 09:05 static/image/common/back.gif
你这前插看起来好别扭啊
你要不就全用scanf 或者全用gets就不会出现这个问题了

这个我知道啊,可我就是不明白为什么这样就会有两个输出啊

阿飞 发表于 2012-4-17 05:09:49

ccqiji 发表于 2012-3-14 14:13 static/image/common/back.gif
gets是最低级的漏洞..

能说明白点吗?这个实在不太懂啊!大哥!

littleevil 发表于 2012-4-20 08:56:28

解决方法:请在26行:gets(p->data);前加一句:fflush(stdin);即可
原因说明:gets是从输入缓冲区获取数据,代码执行到19行时,会输入数据,之后导致输入缓冲区不为空,所以接下来使用gets函数时,该函数尝试从输入缓冲区获取数据,结果是成功获取到数据,故不会等待用户输入而继续循环,导致。。。

风啦啦吹 发表于 2012-4-21 09:56:13

6楼说的基本正确,就是缓冲区的问题,导致你第一次进while循环的时候,gets函数默认有数据,而这个数据是第一次输入时候 的‘\n’回车,被gets接收了,所以会略过gets函数的输入,而进行下一次循环,也就是输出了两次那个 “请输入字符串”

还有一个问题,就是楼主你应该要学会设置break断点,通过调试来发现,各个变量的变化,进而发现错误,因为这种错误完全有能力自己调试出来。

辅助初学者 发表于 2016-2-5 13:49:43

路过,努力学习!
页: [1]
查看完整版本: 为什么输出两个啊?