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

C语言中scanf要写两次的有关问题

2013-05-02 
C语言中scanf要写两次的问题本帖最后由 u010309323 于 2013-04-23 20:30:25 编辑C语言的数据结构顺序表的

C语言中scanf要写两次的问题
本帖最后由 u010309323 于 2013-04-23 20:30:25 编辑 C语言的数据结构顺序表的代码问题:为什么其中主函数要写两个scanf才可以正常运行




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

#define OK 1
#define ERROR 0
#define OVERFLOW -2
 
#define MAXSIZE  100
typedef int ElemType;
typedef int Status;

typedef struct{
 ElemType elem[MAXSIZE];
 int length;
}SqList;
SqList L;

int main()
{
int InitList();//顺序表的初始化  构造一个空的顺序表L
int LocateElem();//顺序表的查找
    int ListInsert();//顺序表的插入
    int ListDelete();//顺序表的删除

   char ch;
InitList();//顺序表的初始化  构造一个空的顺序表L
printf("\n");
    printf("输入A执行查找操作\n输入B执行插入操作\n输入C执行删除操作\n");
printf("\n输入想要的操作选择:");
       scanf("%c",&ch);  //此处要写两个scanf才能运行
        scanf("%c",&ch); 
switch(ch)
{
   case'A':LocateElem();break;
   case'B':ListInsert();break;
   case'C':ListDelete();break;
   default:putchar('\a');
 }


    getch();

return 0;
}

int LocateElem()//顺序表的查找
{
int LocateElem_Sq(ElemType e);//顺序表的查找
int B;
ElemType b;
printf("输入要查找的数b:");
scanf("%d",&b);
    B=LocateElem_Sq(b);//顺序表的查找
if(B==0) printf("找不到输入的数!!!\n");
    else printf("要查找的数b:%d是顺序表的第%d个数!!\n",b,B);
return 0;
}

Status InitList_Sq()//顺序表的初始化  构造一个空的顺序表L
{
L.length=0;
return OK;
}

int LocateElem_Sq(ElemType e)//顺序表的查找
{   
//ElemType e;
int i;
for(i=0;i<L.length;i++)
if(L.elem[i]==e) return i+1;
return 0;
}

Status ListInsert_Sq(int i,ElemType e)//顺序表的插入
{
int j;
if(i<1||i>L.length+1) //i值不合法,合法范围是1<=i<=L.length+1
{
printf("参数i值不合法!!!\n");
return ERROR;
}
if(L.length==MAXSIZE) //当前存储已满
{
printf("表已满无法插入!!!\n");
return ERROR;
}
for(j=L.length-1;j>=i-1;j--)//j从最后一个开始,到第i个L.elem[i-1]
L.elem[j+1]=L.elem[j];
L.elem[i-1]=e;
L.length=L.length+1;
return OK;
}

Status ListDelete_Sq(int i,ElemType e)//顺序表的删除
{
int j;
if(L.length==0)
{
printf("表已空无法删除!!!\n");
return ERROR;
}
if(i<1||i>L.length) 
{
printf("参数i值不合法!!!\n");
return ERROR;
}
e=L.elem[i-1];
for(j=i;j<=L.length-1;j++)
L.elem[j-1]=L.elem[j];
L.length=L.length-1;
return OK;
}

void Shuru()//单链表的建立
{
ElemType i;int m;
    printf("输入建立单链表的长度[<=100]:");
 scanf("%d",&m);
    printf("用空格隔开输入要建立单链表的%d个数的值:\n",m);
for(i=0;i<m;i++)
    {
        scanf("%d",&L.elem[i]);
}
L.length=m;
}


int ListInsert()//顺序表的插入
{
Status ListInsert_Sq(int i,ElemType e);//顺序表的插入
int i;
int N,A;
ElemType n;
printf("空格隔开输入要插入的位置和数值:");


scanf("%d%d",&N,&n);
    A=ListInsert_Sq(N,n);//顺序表的插入
if(A==1)
{
printf("输出插入后的顺序表:");
for(i=0;i<L.length;i++)
printf("%5d",L.elem[i]);
}
else printf("插入失败!!!");
printf("\n");
return 0;
}

int ListDelete()//顺序表的删除
{
Status ListDelete_Sq(int i,ElemType e);//顺序表的删除
int i;
int M,B;
ElemType m;
printf("输入要删除的位置:");
    scanf("%d",&M);
    B=ListDelete_Sq(M,m);//顺序表的删除
if(B==1)
{
printf("输出删除后的顺序表:");
for(i=0;i<L.length;i++)
printf("%5d",L.elem[i]);
}
else printf("删除失败!!!");
printf("\n");
return 0;
}

int InitList()//顺序表的初始化  构造一个空的顺序表L
{
Status InitList_Sq();//顺序表的初始化  构造一个空的顺序表L
    void Shuru();//单链表的建立
int A;
    A=InitList_Sq();//顺序表的初始化  构造一个空的顺序表L
    if(A==1) printf("顺序表初始化成功!!!\n");
    Shuru();//单链表的建立
return 0;
}
[解决办法]
       scanf("%c",&ch);  //此处要写两个scanf才能运行
         scanf("%c",&ch); 
是这样的,因为前一个是要接受回车的。
[解决办法]


       scanf("%c",&ch);  //此处第一个scanf获取的是InitList()中输入数据中遗留的回车符
       scanf("%c",&ch);  //第二个才会把你输入的选择赋值给ch,或者说输入的数据放到内存中的ch变量中


可以通过scanf("%*c%c", &ch);解决InitList()中输入数据时会遗留回车符
[解决办法]
scanf(" %c",&ch);

加个空格

热点排行