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

lh-pch 2013-04-23 08:26:55
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;
}
...全文
554 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
lh-pch 2013-04-24
  • 打赏
  • 举报
回复
ok!谢各位了
FancyMouse 2013-04-24
  • 打赏
  • 举报
回复
scanf(" %c",&ch);
加个空格
自信男孩 2013-04-24
  • 打赏
  • 举报
回复

       scanf("%c",&ch);  //此处第一个scanf获取的是InitList()中输入数据中遗留的回车符
       scanf("%c",&ch);  //第二个才会把你输入的选择赋值给ch,或者说输入的数据放到内存中的ch变量中
可以通过scanf("%*c%c", &ch);解决InitList()中输入数据时会遗留回车符
lh-pch 2013-04-23
  • 打赏
  • 举报
回复
不明白?书上的为什么一个行
Carl_CCC 2013-04-23
  • 打赏
  • 举报
回复
scanf("%c",&ch); //此处要写两个scanf才能运行 scanf("%c",&ch); 是这样的,因为前一个是要接受回车的。

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧