| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 866 人关注过本帖
标题:程序执行需要多敲一次回车 求助
只看楼主 加入收藏
韭菜
Rank: 2
等 级:论坛游民
帖 子:51
专家分:94
注 册:2010-9-26
结帖率:100%
收藏
已结贴  问题点数:10 回复次数:9 
程序执行需要多敲一次回车 求助
求助:1.姓名中间不能有空格,使用“%[^\n]”替换“%s”后,只能输入一条记录
      2.记录输入完毕后Ctrl+Z,需要多敲一次回车
程序代码:
#include<stdio.h>
#include<stdlib.h>
#define len sizeof(node)
typedef struct Node
{
    char name[25];
    int data;
    struct Node *link;
}node;
typedef struct List
{
    node *first,*last;
}list;
void cpy(char *a,char *b);
void init(node *a);   
int show(list a);
int insert(list *a,int num,char name[])
{
    node *p=(node *)malloc(len);
    cpy(name,p->name);
    p->data=num;
    p->link=NULL;
    if(a->first==NULL)
    {
        a->first=p;
        a->last=p;
    }
    else
    {
        (a->last)->link=p;
        a->last=p;
        p->link=NULL;
    }
    show(*a);
    return 0;
}
void main()
{
    list a;
    a.first=a.last=NULL;
    char name[25];
    int data;
    do
    {
        *name=NULL;
        printf("请输入姓名: \n");
        scanf("%s",name);
        if(*name==NULL) break;
        printf("请输入成绩: \n");
        scanf("%d",&data);
        insert(&a,data,name);
    }while(1);
    system("pause");
    show(a);
}
void cpy(char *a,char *b)
{
    while(*a!=NULL)
        *b++=*a++;
    *b='\0';
}
void init(node *a)
{
    cpy("",a->name);
    a->data=0;
    a->link=NULL;
}
int show(list a)
{
    node *p=a.first;
    printf("\n\n");
    while(p!=NULL)
    {
        printf("%-10s  %5d  \n",p->name,p->data);
        p=p->link;
    }
    printf("\n");
    return 0;
}
搜索更多相关主题的帖子: 姓名 
2011-02-18 14:52
『点点滴滴』
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
帖 子:168
专家分:1035
注 册:2007-7-9
收藏
得分:5 
do
    {
        *name=NULL;
        printf("请输入姓名: \n");
        gets(name);
        if(*name==NULL) break;
        printf("请输入成绩: \n");
        scanf("%d",&data);
        insert(&a,data,name);
        getchar();
    }while(1);
2011-02-18 14:58
韭菜
Rank: 2
等 级:论坛游民
帖 子:51
专家分:94
注 册:2010-9-26
收藏
得分:0 
望楼上能解释一下  原先的程序为什么不行  麻烦了
2011-02-18 15:25
wujieru
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:1
帖 子:1108
专家分:1939
注 册:2010-10-9
收藏
得分:0 
是这样子的 看开点
2011-02-18 15:31
韭菜
Rank: 2
等 级:论坛游民
帖 子:51
专家分:94
注 册:2010-9-26
收藏
得分:0 
gets是一个相当危险的函数  

有没有其他办法
2011-02-18 15:41
『点点滴滴』
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
帖 子:168
专家分:1035
注 册:2007-7-9
收藏
得分:0 
    while( ( name[i++] = getchar() ) != '\n' ) ;
        name[i-1] = '\0' ;

记得在insert后边加一个getchar();
读掉输入成绩后的'\n' ;


[ 本帖最后由 『点点滴滴』 于 2011-2-18 16:04 编辑 ]
2011-02-18 15:49
韭菜
Rank: 2
等 级:论坛游民
帖 子:51
专家分:94
注 册:2010-9-26
收藏
得分:0 
图片附件: 游客没有浏览图片的权限,请 登录注册
   新的问题又来了  
2011-02-18 16:00
点线面
Rank: 8Rank: 8
来 自:NO.-1
等 级:蝙蝠侠
帖 子:525
专家分:980
注 册:2011-1-3
收藏
得分:0 
估计楼主想做双向性链表,不过单向链表不是很熟练。

小代码,大智慧
2011-02-18 16:10
韭菜
Rank: 2
等 级:论坛游民
帖 子:51
专家分:94
注 册:2010-9-26
收藏
得分:0 
才学不久  敬请指点一二
2011-02-18 16:11
犬虫门心
Rank: 8Rank: 8
来 自:西安
等 级:蝙蝠侠
帖 子:209
专家分:753
注 册:2011-1-25
收藏
得分:5 
对于scanf("%s", ...);要求用^+z是指“非正常结束输入”,这其实也是一个“有效”的输入,回车是表示“输入结束”,但scanf()会返回-1表示输入失败,从而使字符串的内容并没有更改,还是保持第一个字符为0(也就是所谓的'\0'或者NULL)
由于没有用gets(),所以没有办法“不输入”就完成输入,所以才会要求输入^+z
但是,如果使用gets(),这就会使程序前一次调用的scanf()“遣送”回去的空格字符(包括\t、\n和空格字符)被gets()函数接受,从而使输入混乱,是不得已的方法,只能应用于教学中的简单程序练习。

当一名对得起学生学费的老师,一直是我的目标!我会更努力的!
2011-02-18 17:40
快速回复:程序执行需要多敲一次回车 求助
数据加载中...
 
   



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

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