| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2210 人关注过本帖
标题:紧急求助 关于getchar()的疑惑
只看楼主 加入收藏
fantasy89f
Rank: 1
等 级:新手上路
帖 子:30
专家分:0
注 册:2008-2-25
收藏
 问题点数:0 回复次数:10 
紧急求助 关于getchar()的疑惑
void deleteall()
{
    printf("\n\t\t确认删除?(y/n)");
    if (getchar()=='Y'||getchar()=='y')
    {
        fclose(fp);
        if ((fp=fopen("student.txt","wb"))==NULL)
        {
            printf("\n\t\t不能打开文件,删除失败");
            readfromfile();
        }
        printf("\n\t\t纪录已删除,按任意键返回主菜单");
        getchar();
        mainmenu();
    }
    else
        mainmenu();
}
大家帮我看看这个函数
按理说系统运行到getchar()时会让用户输入单个字符再执行mainmenu();
可是运行时却跳过getchar()直接执行mainmenu()了
各位高手帮忙解释下..
谢谢
搜索更多相关主题的帖子: getchar 
2008-02-28 11:53
peach5460
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:武汉
等 级:贵宾
威 望:30
帖 子:2780
专家分:6060
注 册:2008-1-28
收藏
得分:0 
因为你上面
if (getchar()=='Y'||getchar()=='y')
这行getchar了一个字符...这个字符被存入缓冲区
你下面getchar();
        mainmenu();的时候...这个getchar会去读缓冲区,读到了一个字符...于是认为你已输入...于是开始执行mainmenu

我总觉得授人以鱼不如授人以渔...
可是总有些SB叫嚣着:要么给代码给答案,要么滚蛋...
虽然我知道不要跟SB一般见识,但是我真的没修炼到宠辱不惊...
2008-02-28 11:58
fantasy89f
Rank: 1
等 级:新手上路
帖 子:30
专家分:0
注 册:2008-2-25
收藏
得分:0 
看了老贴发现这里用两个getchar();就可以解决问题,我想知道为什么
还有if (getchar()=='y')这个语句跟本不运行,但是if (getchar()=='y'||getchar()=='Y')这样一改就能运行了,难道getchar()只能两个一起才有作用???
2008-02-28 12:01
wubizao
Rank: 1
来 自:荆州长大电信
等 级:新手上路
帖 子:223
专家分:0
注 册:2006-6-24
收藏
得分:0 
getchar()的时候
你输入一个字符后
比如Y,然后按了下回车
这个回车暂时放在缓冲区中
第二次的时候,getchar()读的是回车,不会给机会你再次输入的

在路上走,看见了C,从此爱上了她
2008-02-28 12:05
xianshizhe111
Rank: 1
等 级:新手上路
帖 子:1451
专家分:0
注 册:2007-12-8
收藏
得分:0 
把全吗帖上来一看.
2008-02-28 12:05
fantasy89f
Rank: 1
等 级:新手上路
帖 子:30
专家分:0
注 册:2008-2-25
收藏
得分:0 
[bo]以下是引用 [un]peach5460[/un] 在 2008-2-28 11:58 的发言:[/bo]

因为你上面

这行getchar了一个字符...这个字符被存入缓冲区
你下面getchar();
        mainmenu();的时候...这个getchar会去读缓冲区,读到了一个字符...于是认为你已输入...于 ...

那为什么把if (getchar()=='Y'||getchar()=='y')改成if (getchar()=='Y')就不运行呢??
2008-02-28 12:06
fantasy89f
Rank: 1
等 级:新手上路
帖 子:30
专家分:0
注 册:2008-2-25
收藏
得分:0 
//主程序
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <malloc.h>
struct record
{
char id[10];
char name[20];
char phone[20];
char adress[40];
char postcode[10];
char e_mail[30];
}student[500];
int num=0;
FILE *fp;
void mainmenu();
void newrecord();//添加纪录
void searchmenu();//查找菜单
void searchbyid();
void searchbyname();
void searchbyphone();
void deletemenu();
void deleteall();
void deleteone();
void showall();
void readfromfile();
void writetofile();


void main()
{
    readfromfile();
}



//从文件导入
void readfromfile()
{
    if((fp=fopen("student.txt","rb"))==NULL)
    {
        printf("\n\t\t通讯录文件不存在");
        if ((fp=fopen("student.txt","wb"))==NULL)
        {
            printf("\n\t\t建立失败");
            exit(0);
        }
        else
        {
            printf("\n\t\t通讯录文件已建立");
            printf("\n\t\t按任意键进入主菜单");
            getchar();
            mainmenu();
        }
        
        exit(0);
    }
    fseek(fp,0,2);        /*文件位置指针移动到文件末尾*/
    if (ftell(fp)>0)      /*文件不为空*/
    {
        rewind(fp);       /*文件位置指针移动到文件开始位置*/
        for (num=0;!feof(fp) && fread(&student[num],sizeof(struct record),1,fp);num++);
        printf("\n\t\t文件导入成功");
        printf("\n\t\t按任意键返回主菜单");

        getchar();
        mainmenu();
    }
    printf("\n\t\t文件导入成功");
    printf("\n\t\t通讯录文件中无任何纪录");
    printf("\n\t\t按任意键返回主菜单");

    getchar();
    mainmenu();
}








//主菜单
void mainmenu()
{
    int choic;
    system("cls");
    printf("\t\t******************** 通讯录 ********************\n");
    printf("\t\t*********** 1-新添纪录    2-查询菜单 ***********\n");
    printf("\t\t*********** 3-删除菜单    4-记录排序 ***********\n");
    printf("\t\t*********** 5-退出系统               ***********\n");
    printf("\t\t************************************************\n");
    printf("\n\t\t请选择:");
    scanf("%d",&choic);
    switch (choic)
    {
        case 1:newrecord();break;
        case 2:searchmenu();break;
        case 3:deletemenu();break;
        
        case 5:writetofile();
        default:mainmenu();
    }
}



//查询菜单
void searchmenu()
{
    int choic;
    system("cls");
    printf("\t\t******************** 请选择 ********************\n");
    printf("\t\t********** 1-显示所有  2-按学号查询 ************\n");
    printf("\t\t********** 3-按姓名查询4-按电话查询 ************\n");
    printf("\t\t********** 5-返回主菜单             ************\n");
    printf("\t\t************************************************\n");
    printf("\t\t请选择:");
    scanf("%d",&choic);
    switch (choic)
    {
        case 1:showall();break;
        case 2:searchbyid();break;
        case 3:searchbyname();break;
        case 4:searchbyphone();break;
        case 5:mainmenu();break;
    }
}


//删除菜单
void deletemenu()
{
    int choic;
    system("cls");
    printf("\t\t******************* 删除菜单 *******************\n");
    printf("\t\t*********** 1-删除所有    2-删除单个 ***********\n");
    printf("\t\t*********** 3-返回主菜单             ***********\n");
    printf("\t\t************************************************\n");
    printf("\n\t\t请选择:");
    scanf("%d",&choic);
    switch (choic)
    {
        case 1:deleteall();break;
        case 2:deleteone();break;
        case 3:mainmenu();break;
        default:mainmenu();break;
    }


}




//删除所有
void deleteall()
{
    printf("\n\t\t确认删除?(y/n)");
    if (getchar()=='y'||getchar()=='Y')
    {
        fclose(fp);
        if ((fp=fopen("student.txt","wb"))==NULL)
        {
            printf("\n\t\t不能打开文件,删除失败");
            readfromfile();
        }
        printf("\n\t\t纪录已删除,按任意键返回主菜单");
        getchar();
        getchar();
        mainmenu();
    }
    else
        mainmenu();
}



//删除单个
void deleteone()
{
    int i,j;
    char deletetarget[20];
    int deletemark;
    int a;
    printf("\t\t******************* 删除单个纪录 ******************");
    printf("\n\t\t请输入要删除学生的学号或姓名:");
    scanf("%s",&deletetarget);
    if(num==0)
    {
        printf("\n\t\t对不起,通讯录中没有您要删除的纪录");
        printf("\n\t\t按任意键返回主菜单");
        getchar();
        mainmenu();
    }
    for (i=0;i<num;i++)
    {
        if (student[i].id==deletetarget)
        {
            printf("\n\t\t以下是您要删除的学生纪录:");
            printf("\n\t\t学号:  %s",student[i].id);
            printf("\n\t\t姓名:  %s",student[i].name);
            printf("\n\t\t电话:  %s",student[i].phone);
            printf("\n\t\t地址:  %s",student[i].adress);
            printf("\n\t\te-mail:%s",student[i].e_mail);
            printf("\n\t\t是否删除?(y/n)");
            if (getchar()=='Y'||getchar()=='y')
            {
                for (j=i;j<num-1;j++)      /*纪录移动,从stud数组中删除之*/
                student[i]=student[i+1];
                deletemark++;
                printf("\n\t\t删除成功");
                printf("\n\t\t是否继续删除?(y/n)");
                if (getchar()=='Y'||getchar()=='y')
                    deleteone();
                mainmenu();
            }
            else
                mainmenu();
        }
        else
            continue;
    }


    if (deletemark==0)
    {
        for (i=a;i<num;i++)
        {
            if (student[i].name==deletetarget)
            {
                printf("\n\t\t以下是您要删除的学生纪录:");
                printf("\n\t\t学号:  %s",student[i].id);
                printf("\n\t\t姓名:  %s",student[i].name);
                printf("\n\t\t电话:  %s",student[i].phone);
                printf("\n\t\t地址:  %s",student[i].adress);
                printf("\n\t\te-mail:%s",student[i].e_mail);
                printf("\n\t\t是否删除?(y/n)");
                if (getchar()=='Y'||getchar()=='y')
                {
                    for (j=i;j<num-1;j++)      /*纪录移动,从stud数组中删除之*/
                    student[i]=student[i+1];
                    deletemark++;
                    printf("\n\t\t删除成功");
                    if((i+1)<num)
                    {
                         printf("\n\t\t是否继续删除相同姓名的同学信息?(y/n)");
                         if (getchar()=='Y'||getchar()=='y')
                         {
                             a=i;
                             continue;
                         }

                    }
                    printf("\n\t\t是否继续删除?(y/n)");
                    if (getchar()=='Y'||getchar()=='y')
                        deleteone();
                    mainmenu();
                }
                else
                    mainmenu();
            }
            else
                continue;
        }
    }
}



//添加纪录
void newrecord()
{
    char c;

    printf("\t\t**************** 请输入学生信息 ****************\n");
    printf("\t\t输入学号:");
    scanf("%s",&student[num].id);
    printf("\n\t\t输入姓名:");
    scanf("%s",&student[num].name);
    printf("\n\t\t输入电话号码:");
    scanf("%s",&student[num].phone);
    printf("\n\t\t输入地址:");
    scanf("%s",&student[num].adress);
    printf("\n\t\t输入邮编:");
    scanf("%s",&student[num].postcode);
    printf("\n\t\t输入e-mail:");
    scanf("%s",&student[num].e_mail);
    num++;
    printf("\n\t\t是否继续添加?(Y/N):");
    if (getchar()=='y' || getchar()=='Y')
        newrecord();
    mainmenu();
}




//显示所有
void showall()
{
    int i;

    if(num!=0)
    {
    printf("\t\t*************** 以下为通讯录所有信息************\n");
    for (i=0;i<num;i++)
    {
         printf("\n\t\t学号:  %s",student[i].id);
         printf("\n\t\t姓名:  %s",student[i].name);
         printf("\n\t\t电话:  %s",student[i].phone);
         printf("\n\t\t地址:  %s",student[i].adress);
         printf("\n\t\t邮编:  %s",student[i].postcode);
         printf("\n\t\te-mail:%s",student[i].e_mail);
         printf("\n");
    }
    printf("\n\t\t************************************************");
    }
    else
        printf("\t\t通讯录中无任何纪录");
    printf("\n\t\t按任意键返回主菜单:");
    getchar();
    mainmenu();
}


//按电话查询
void searchbyphone()
{

    int i;
    int a=0;
    printf("\t\t***************** 按学号查找 ******************\n");
    char phone[10];
    printf("\t\t请输入学号:");
    scanf("%s",phone);
    for(i=0;i<num;i++)
    {
        if (student[i].phone==phone)
        {

            printf("\n\t\t*************** 以下是您查找的学生信息 ************");
            printf("\n\t\t学号:  %s",student[i].id);
            printf("\n\t\t姓名:  %s",student[i].name);
            printf("\n\t\t电话:  %s",student[i].phone);
            printf("\n\t\t地址:  %s",student[i].adress);
            printf("\n\t\te-mail:%s",student[i].e_mail);
            printf("\n\t\t***************************************************");
            printf("\t\t按任意键返回主菜单:");
            system("pause");
            getchar();
            mainmenu;
        }

    }
    
}








//按姓名查询
void searchbyname()
{

    int i;
    int a=0;
    printf("\t\t***************** 按姓名查找 ******************\n");
    char name[20];
    printf("\t\t请输入姓名:");
    scanf("%s",name);
    for(i=a;i<num;i++)
    {
        if (student[i].name==name)
        {

            printf("\n\t\t*************** 以下是您查找的学生信息 ************");
            printf("\n\t\t学号:  %s",student[i].id);
            printf("\n\t\t姓名:  %s",student[i].name);
            printf("\n\t\t电话:  %s",student[i].phone);
            printf("\n\t\t地址:  %s",student[i].adress);
            printf("\n\t\te-mail:%s",student[i].e_mail);
            printf("\n\t\t***************************************************");
            if (i<num)
            {
                printf("\n\t\t是否继续查找相同名字的学生信息:");
                if (getchar()=='Y' || getchar()=='y')
                {
                    a=i;
                    searchbyname();

                }
                else
                    mainmenu();
            }
            else
            {
                printf("\t\t按任意键返回主菜单:");
                system("pause");
                getchar();
                mainmenu;
            }

        }
    }

}



//按学号查询
void searchbyid()
{
    int i;
    int a=0;
    printf("\t\t***************** 按学号查找 ******************\n");
    char id[10];
    printf("\t\t请输入学号:");
    scanf("%s",id);
    for(i=0;i<num;i++)
    {
        if (student[i].id==id)
        {
            printf("\n\t\t*************** 以下是您查找的学生信息 ************");
            printf("\n\t\t学号:  %s",student[i].id);
            printf("\n\t\t姓名:  %s",student[i].name);
            printf("\n\t\t电话:  %s",student[i].phone);
            printf("\n\t\t地址:  %s",student[i].adress);
            printf("\n\t\te-mail:%s",student[i].e_mail);
            printf("\n\t\t***************************************************");
            printf("\t\t按任意键返回主菜单:");
            system("pause");
            getchar();
            mainmenu;
        }

    }
    
}


//写入文件
void writetofile()
{
    int i;
    for (i=0;i<num;i++)
    {
        fwrite(&student[i],sizeof(struct record),1,fp);
    }
    fclose(fp);
    printf("\n\t\t通讯录文件已保存");
    printf("\n\t\t按任意键退出程序\n\t\t");
    exit(0);
 
}

我学c才几个月,里面肯定有好多错误,见笑了
2008-02-28 12:07
wubizao
Rank: 1
来 自:荆州长大电信
等 级:新手上路
帖 子:223
专家分:0
注 册:2006-6-24
收藏
得分:0 
if (getchar()=='Y'||getchar()=='y')
    {
       //补上一句,while(getchar() != '\n')
                      continue;

在路上走,看见了C,从此爱上了她
2008-02-28 12:08
sunkaidong
Rank: 4
来 自:南京师范大学
等 级:贵宾
威 望:12
帖 子:4496
专家分:141
注 册:2006-12-28
收藏
得分:0 
void deleteall()
{  char c;
    printf("\n\t\t确认删除?(y/n)");
    c=getchar();
    if (c=='Y'||c=='y')
    {
        fclose(fp);
        if ((fp=fopen("student.txt","wb"))==NULL)
        {
            printf("\n\t\t不能打开文件,删除失败");
            readfromfile();
        }
        printf("\n\t\t纪录已删除,按任意键返回主菜单");
        getchar();
        mainmenu();
    }
    else
        mainmenu();
}
2008-02-28 12:11
fantasy89f
Rank: 1
等 级:新手上路
帖 子:30
专家分:0
注 册:2008-2-25
收藏
得分:0 
看来getchar()是个不好惹的东西
以后要小心了
谢谢各位大狭热心帮助
2008-02-28 12:16
快速回复:紧急求助 关于getchar()的疑惑
数据加载中...
 
   



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

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