| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 578 人关注过本帖, 1 人收藏
标题:不知道怎么回事,各位帮忙看看
只看楼主 加入收藏
obstratiker
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:1
帖 子:198
专家分:758
注 册:2011-5-5
结帖率:100%
收藏(1)
已结贴  问题点数:20 回复次数:10 
不知道怎么回事,各位帮忙看看
我想写一个简单链表,直接上程序吧,在注释中标明问题
程序代码:
#include <stdio.h>
#include <stdlib.h>

struct node
{
    char a;
    struct node *next;
};

void printList(struct node *Tou)
{
    struct node *h1=Tou;
    while(h1->next!=NULL)
    {
        h1=h1->next;
        printf("%c --> ",h1->a);
    }
    printf("NULL\n\n");
}

void insert(struct node *Tou)
{
    struct node *h1=Tou,*h2=(struct node *)malloc(sizeof (struct node));
    printf("Enter a character:");
//    int n;                                                //非得加上这两句,把'\n'消除了才能输入h2->a……非常不解
//    scanf("%d",&n);                                       
    scanf("%c",&h2->a);                                    //如果不加上上面两句,在运行时这句就会直接跳过,给h2->a赋的值是'\n'
    h2->next=NULL;
    while(h1->next!=NULL)
        h1=h1->next;
    h1->next=h2;
    printList(Tou);
}


int main(void)
{
    printf("Enter your choice:\n"
        "1 to insert an element into the list.\n"
        "2 to delete an element from the list.\n"
        "3 to end.\n? ");
    int n;
    scanf("%d",&n);                                                        //我在想原因就是在这输入n时,还有一个'\n'在输入流中,影响了后面的输入,为什么会这样呢……
    struct node *Tou=(struct node *)malloc(sizeof (struct node));
    Tou->a=0;
    Tou->next=NULL;
    while(n!=3)
    {
        switch(n)
        {
            case 1:
                insert(Tou);
                break;
        }
        printf("? ");
        scanf("%d",&n);
    }
    return 0;
}
请大家看看,谢啦
搜索更多相关主题的帖子: next 
2012-08-14 19:19
dsl975708035
Rank: 3Rank: 3
来 自:平凉
等 级:论坛游侠
帖 子:101
专家分:152
注 册:2012-8-3
收藏
得分:20 
用getchar()吃回车啊

唉,初三要停停了,舍不得啊。。
2012-08-14 19:29
obstratiker
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:1
帖 子:198
专家分:758
注 册:2011-5-5
收藏
得分:0 
回复 2楼 dsl975708035
为什么我用scanf()会遗留一个回车?
以前都没碰到这样的事儿
2012-08-14 19:47
dsl975708035
Rank: 3Rank: 3
来 自:平凉
等 级:论坛游侠
帖 子:101
专家分:152
注 册:2012-8-3
收藏
得分:0 
以前你没在输入后边在更一个输入

唉,初三要停停了,舍不得啊。。
2012-08-14 19:56
dsl975708035
Rank: 3Rank: 3
来 自:平凉
等 级:论坛游侠
帖 子:101
专家分:152
注 册:2012-8-3
收藏
得分:0 
哈,真的,
实践是检验真理的唯一标准

[ 本帖最后由 dsl975708035 于 2012-8-14 20:10 编辑 ]

唉,初三要停停了,舍不得啊。。
2012-08-14 20:01
obstratiker
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:1
帖 子:198
专家分:758
注 册:2011-5-5
收藏
得分:0 
回复 5楼 dsl975708035
以前怎么没有多次输入scanf,多了去了
这个现象还是第一次
2012-08-14 20:10
dsl975708035
Rank: 3Rank: 3
来 自:平凉
等 级:论坛游侠
帖 子:101
专家分:152
注 册:2012-8-3
收藏
得分:0 
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    int a;
    printf("Input");
    scanf("%d",&a);
    printf("a");
    scanf("%d",&a);
    return 0;
}
我用这段代码来模拟该问题,你看是不是缺了什么

唉,初三要停停了,舍不得啊。。
2012-08-14 20:11
obstratiker
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:1
帖 子:198
专家分:758
注 册:2011-5-5
收藏
得分:0 
以下是引用dsl975708035在2012-8-14 20:11:31的发言:

#include  
#include  
 
int main(void)
{
    int a;
    printf("Input");
    scanf("%d",&a);
    printf("a");
    scanf("%d",&a);
    return 0;
}
我用这段代码来模拟该问题,你看是不是缺了什么
我明白了,哈哈
你这段代码连续两次输入时没有问题的,但是如果换成
程序代码:
int main(void)
{
    char a;
    printf("Input");
    scanf("%c",&a);
    printf("%c",a);
    scanf("%c",&a);
    return 0;
}
就会直接跳过第二次scanf(),是因为转换符的原因!~
%d的时候系统没把'\n'看成数字(没法识别),所以回车保留在输入流中没事儿
但如果%c的时候,第一次进行scanf(),就是遗留一个'\n'在输入流中,然后第二次scanf()
系统直接认为'\n'是一个字符,所以就直接输入了!~
2012-08-14 20:22
dsl975708035
Rank: 3Rank: 3
来 自:平凉
等 级:论坛游侠
帖 子:101
专家分:152
注 册:2012-8-3
收藏
得分:0 
getchar()只能接你输入的一个字符,而不是字符串。getchar()也不是乱用的,一般情况就用在输入字符的的情况下。至于你后面说的每当有输入语句时都去加一个getchar()是没有必要的。如果你想用getchar()去接住上次输入的回车符以便给下面的运算带来准确性的话,就是在输入整型或者浮点型之后再加一个getchar(),至于要不要在每一行都加就要看什么情况了。我可以给你举两个个简单的例子
#include"stdio.h"
main()
{char ch1,ch2,ch3;
printf("Enter:");
ch1=getchar();
getchar();
printf("Enter:");
ch2=getchar();
printf("Enter:");
ch3=getchar();
putchar(ch1);
putchar(ch2);
putchar(ch3);
putchar('\n');}
可以tc运行下。这个程序就是每句后加了getchar()的,是用来你在运行的时候接住你输入的回车的(因为回车也是字符)。再来看一个例子不是每句都需要getchar()的
#include"stdio.h"
main()
{float x,y,z;
 char po;
printf("Enter:');   /*提示用户输入数据*/                                    
scanf("%f,%f",&x,&y);
getchar();       /*接住scanf输入后的回车符*/
printf("选择运算符号+、—、*、/:");
 op=getchar();  /*输入运行符的,不是接回车*/  
switch(op)
{case '+':z=x+y;break;
case '-':z=x-y;break;
case '*':z=x*y;break;
case '/':z=x/y;break;
default:printf("%c,不是运行符.\n",op);
exti(0);}   /*用来退出程序 */
 printf(%g%c%g=%g\n\n",x,op,y,z);}
这个是计算器的程序,这里只用了一个getchar接回车(就是你所说的吃掉回车)。再来看一个不需要getchar接回车的程序
#include"stdio.h"
main()
{char ch1;
ch1=getchar();
putchar(ch1);}
这个程序就是打印出你输入的字符,不需要用getchar来接回车,因为getchar只接一个字符,当你输入一个字母再回车时,getchar只接第一个字母,默认回车符跳出输入界面。以上程序在turboc中运行。
希望你能通过三个例子明白什么时候用getchar,什么时候不需要。
注:摘自搜搜问问

唉,初三要停停了,舍不得啊。。
2012-08-14 20:26
dsl975708035
Rank: 3Rank: 3
来 自:平凉
等 级:论坛游侠
帖 子:101
专家分:152
注 册:2012-8-3
收藏
得分:0 
回复 8楼 obstratiker
厉害

唉,初三要停停了,舍不得啊。。
2012-08-14 20:26
快速回复:不知道怎么回事,各位帮忙看看
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018860 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved