首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

gets()和scanf()的区别,两个的混用能导致不同程序的异常,但编译均通过

2013-04-07 
gets()和scanf()的区别,两个的混用能导致不同程序的错误,但编译均通过。程序一://#include stdafx.h#incl

gets()和scanf()的区别,两个的混用能导致不同程序的错误,但编译均通过。
程序一:

//#include "stdafx.h"

#include"stdio.h"
#include"conio.h"
#include"string.h"
#include"stdlib.h"
int N;
char mima[20]="mm";

//定义书籍的结构体

struct book
{
    long num;
    char name[20];
    char publish[20];/*出版社*/
    struct time
    {
        int day;
        int month;
        int year;
    }t;//t
    int jie;/*借阅与否*/
}bk[20];

int mymainmenu();//主菜单函数
int mimayanzheng();//密码验证函数
int adm();//管理员界面函数
void xinxi();//录入信息函数
void show();//查看信息函数
void xiugai();//修改信息函数
void xiugaimima();//修改密码函数
int peo();//用户界面函数
void jieyue();//借阅书籍函数
void show_all();//查看所有书籍信息
void show_name();//依据书名查看书籍信息


//主函数
void main()
{
int x,x2,s;//s用来判断密码验证结果0/1
do{
system("cls");
x=mymainmenu();//主菜单函数***
switch(x)
{
case 1: system("cls"); //进入管理员模式
s=mimayanzheng();//密码验证函数,其中包含界面显示***
do
{
if(s==1)
{system("cls");
x2=adm();//管理员界面函数,包含接收指令***

switch(x2)
{
case 1:system("cls");xinxi();break;//录入信息函数***
case 2:system("cls");show();break;//查看信息函数***
case 3:system("cls");xiugai();break;//修改信息函数***
case 4:system("cls");xiugaimima();break;//修改密码函数***
}

}
else 
{
printf("密码输入错误!");
printf("请按任意键后退出\n");
getch();
break;}
}while(x2!=5);
break;//

case 2:do
{
system("cls");//进入用户界面
x2=peo();//用户界面函数***
switch(x2)
{
case 1:system("cls");show();break;//查看图书函数***
case 2:system("cls");jieyue();break;//借阅图书函数***
}
}while(x2!=3);
break;
}
}while(x!=3);
system("cls");
printf("thank you for your coming!\n");
printf("请按任意键后退出\n");
getch();

}

int mymainmenu()//主菜单函数
{
int a;
printf("*****************************************************\n");
printf("*****************欢迎进入图书管理系统****************\n");
printf("                 请选择操作:                        \n");
printf("                 1、以管理员身份进入\n");
printf("                 2、以读者身份进入\n");
printf("                 3、退出系统\n");
scanf("%d",&a);//错误:scanf("%d\n",&a);
return a;
}
///*
int mimayanzheng()//密码验证函数
{
char b[20];
printf("*****************请输入密码:************************\n");
//gets(b);  //为何用gets(b)循环体就出错?只是快速闪过密码验证的界面??????????????????????????????????
    scanf("%s",b);
return (!strcmp(mima,b));

}
//*/

int adm()//管理员界面函数
{
int a;
printf("*****************************************************\n");


printf("*****************************************************\n");
printf("*****************************************************\n");
printf("*****************欢迎进入管理员系统******************\n");
printf("                 请选择操作:                        \n");
printf("                 1、插入书籍信息\n");
printf("                 2、查看书籍信息\n");
printf("                 3、修改书籍信息\n");
printf("                 4、修改密码\n");
printf("                 5、退出系统\n");
scanf("%d",&a);
return a;
}

void xinxi()//录入信息函数
{
int i;
printf("*****************************************************\n");
printf("*****************插入书籍信息************************\n");
printf("请输入插入书籍总数:\n");
scanf("%d",&N);
for(i=1;i<=N;i++)
{
printf("请输入第%d本书的编号:\n",i);
scanf("%d",&bk[i-1].num);
printf("请输入第%d本书的名字:\n",i);
scanf("%s",&bk[i-1].name);
printf("请输入第%d本书的出版社:\n",i);
scanf("%s",&bk[i-1].publish);
printf("请输入第%d本书的出版年/月/日(以空格隔开):\n",i);
scanf("%d %d %d",&bk[i-1].t.year,&bk[i-1].t.month,&bk[i-1].t.day);
printf("请输入第%d本书是否可借(1/0):\n",i);
scanf("%d",&bk[i-1].jie);
printf("插入书籍成功\n");
}
printf("请按任意键后退出\n");
getch();

}

void show_all()  //查看所有书籍函数
{
int i;
for(i=0;i<N;i++)
{
printf("第%d本书的信息:\n",i+1);
printf("编号:%d\n",bk[i].num);
printf("书名:%s\n",bk[i].name);
printf("出版社:%s\n",bk[i].publish);
printf("出版日期:%d/%d/%d\n",bk[i].t.year,bk[i].t.month,bk[i].t.day);
printf("是否已借阅:%d\n",bk[i-1].jie);
}
printf("请按任意键后退出\n");
getch();
}

void show_name() //依据书名查看书籍信息
{
int i;
char s[20];
printf("请输入所要查找的书籍名字:\n");
//gets(s);//为何不行???????????????????????
scanf("%d",s);
for(i=0;(i<N)&&(!strcmp(s,bk[i].name));i++)
{
printf("查找中,请稍候......");
}
if (i<N)
{
printf("您要查找的书籍信息如下:\n");
printf("编号:%d\n",bk[i].num);
printf("书名:%s\n",bk[i].name);
printf("出版社:%s\n",bk[i].publish);
printf("出版日期:%d/%d/%d\n",bk[i].t.year,bk[i].t.month,bk[i].t.day);
printf("是否已借阅:%d\n",bk[i-1].jie);
}
else
printf("对不起,您所查找的书籍不存在\n");

printf("请按任意键后退出\n");
getch();//缓冲,任意键后再退出
}


void show()//查看信息函数//以依据书籍名字查看信息为例
{
int a;
printf("*****************************************************\n");
printf("*****************查看书籍信息************************\n");
printf("请选择操作:\n");
printf("1、查看所有书籍信息\n");
printf("2、依据书名查看书籍信息\n");
printf("3、返回上一级菜单\n");
scanf("%d",&a);
switch(a)//注意观察未加循环的switch的运行,循环是为了返回上一级菜单
{
case 1:show_all();break;//查看所有书籍函数****
case 2:show_name();break;//依据书名查看书籍信息函数****
}
printf("请按任意键后退出\n");
getch();//缓冲,任意键后再退出
}


void xiugai()//修改书籍信息
{
int i;
char s[20];
printf("请输入所要修改的书籍名字:\n");
//gets(s);
scanf("%s",s);
for(i=0;(i<N)&&(strcmp(s,bk[i].name));i++)
{


printf("查找中,请稍候......");
}
if (i<N)
{
printf("您要查找的书籍信息如下:\n");
printf("编号:%d\n",bk[i].num);
printf("书名:%s\n",bk[i].name);
printf("出版社:%s\n",bk[i].publish);
printf("出版日期:%d/%d/%d\n",bk[i].t.year,bk[i].t.month,bk[i].t.day);
printf("是否已借阅:%d\n",bk[i].jie);

printf("请重新输入书籍信息:\n");
printf("请输入该书的编号:\n");
scanf("%d",&bk[i].num);
printf("请输入该书的名字:\n",i);
scanf("%s",&bk[i].name);
printf("请输入该书的出版社:\n",i);
scanf("%s",&bk[i].publish);
printf("请输入该书的出版年/月/日(以空格隔开):\n",i);
scanf("%d %d %d",&bk[i].t.year,&bk[i].t.month,&bk[i].t.day);
printf("请输入该书是否可借(1/0):\n",&i);
scanf("%d",&bk[i].jie);
printf("修改书籍信息成功\n");

printf("修改后的书籍信息如下:\n");
printf("编号:%d\n",bk[i].num);
printf("书名:%s\n",bk[i].name);
printf("出版社:%s\n",bk[i].publish);
printf("出版日期:%d/%d/%d\n",bk[i].t.year,bk[i].t.month,bk[i].t.day);
printf("是否已借阅:%d\n",bk[i].jie);

}
else
printf("对不起,您所查找的书籍不存在\n");

printf("请按任意键后退出\n");
getch();//缓冲,任意键后再退出

}


void xiugaimima()//修改密码
{
char b[20],c[20];
printf("*****************************************************\n");
printf("*********************修改密码************************\n");
printf("请输入原始密码:\n");
scanf("%s",b);
if (!strcmp(b,mima))
{
printf("请输入新密码:\n");
scanf("%s",b);
printf("请重新输入新密码:\n");
scanf("%s",c);
if(!strcmp(b,c))
{
strcpy(mima,b);
printf("密码设置成功!新密码为:%s\n",mima);
}
else
printf("两次输入的密码不一致,密码设置失败!\n");

}
else
printf("密码输入有误!\n");

printf("请按任意键后退出\n");
getch();
}


int peo()//用户界面函数
{
int a;
printf("*****************欢迎进入读者系统******************\n");
printf("                 请选择操作:                        \n");
printf("                 1、查看书籍信息\n");
printf("                 2、借阅图书\n");
printf("                 3、退出系统\n");
scanf("%d",&a);
return a;
}


void jieyue()//借阅书籍函数
{
int i;
char s[20];
printf("请输入所要借阅的书籍名字:\n");
//gets(s);//同样会导致程序运行时界面只是一闪而过,且无法正常输入
scanf("%s",s);
for(i=0;(i<N)&&(strcmp(s,bk[i].name));i++)
{
printf("查找中,请稍候......");
}
if (i<N)
{
printf("您要借阅的书籍信息如下:\n");
printf("编号:%d\n",bk[i].num);
printf("书名:%s\n",bk[i].name);
printf("出版社:%s\n",bk[i].publish);
printf("出版日期:%d/%d/%d\n",bk[i].t.year,bk[i].t.month,bk[i].t.day);
printf("是否已借阅:%d\n",bk[i-1].jie);

if(bk[i-1].jie)
printf("对不起,该书已借出。\n");
else 
{
bk[i-1].jie=1;
printf("借阅成功!\n");
}
}
else
printf("对不起,您所查找的书籍不存在。\n");


printf("请按任意键后退出\n");
getch();

}


程序二:
#include <stdio.h>
#define N 4
#include <string.h>
#include <malloc.h>



void main(void)
{
    char *p[N];
char c,d;
int i=0;    
void maxstring(char **p);


void replaceString(char **p,char c,char d);
    printf("plese enter %d strings:\n",N);
    for(i=0;i<N;i++)
{
p[i]=(char*)malloc(100*sizeof(char));
//scanf("%s", p[i]);  //为何不行?用scanf则最后一个子程序不能得到正确结果,无法改变字符串数组内容
gets(p[i]);
}

    maxstring(p);//获取最大的字符串

printf("please enter the char to be replaced by the second char: \n");
scanf("%c %c",&c,&d);//中间留个空格,这样输入时不容易出错。
replaceString(p,c,d);
}

void maxstring(char **p)
{    
int ii;
char *pp=(char*)malloc(sizeof *pp);
       
    strcpy(pp,*p);
   
for(ii=1;ii<N;ii++)                                       
        if(strcmp(pp,p[ii])<0)
                strcpy(pp,p[ii]);


printf("the maximum string is:\n");
puts(pp);
}

void replaceString(char **p,char c,char d)  
{
char *q=(char*)malloc(sizeof *p);
int i;

 for(i=0;i<N;i++)
        {
                for(q=*(p+i);*q!='\0';q++)
                {        
                        if(*q==c)
                               *q = d;                        }
                puts(*(p+i));
        }


}



以上是我自己编写的两个程序,程序一是一个简单的图书管理系统,但是在这个程序中,几乎用到gets()函数的地方都会在运行时出现异常,导致界面只是快速一闪而过,而不能像预期那样正常输入数据,但是换成scanf之后就正常。
程序二是一个字符串处理程序,获取字符串数组的最大串以及对对特定字符进行替换,这个程序则与程序一恰恰相反的问题,在主函数中用scanf则会导致子程序replaceString(p,c,d)不产生任何效果,而换成gets()之后就正常了。
以上两个程序在编译运行过程中都无报错,但是就是结果不正常,自己实在想不通为什么会导致这样的结果,恳请大家帮忙看看,谢谢~ c gets scanf
[解决办法]
引用:
引用:183  scanf("%s",s); //------------------ 不是%d
scanf与gets的不同在于,scanf("%s",s)不支持空格、制表符、回车换行,遇到上述内容将引发参数中止;gets仅不支持回车换行,即遇到回车换行引发参数终止。
scanf、gets不可混淆互换。
谢谢啦。但是我在输入的时候一……
gets接受换行符。scanf("%s")换行符还留在缓冲区,导致下面的scanf("%c %c");第一个%c将接受到换行符。

热点排行