scanf输入字母,自动输入一个‘10’,是为什么?
写的一个创建邻接矩阵的程序,在输入顶点表的时候scanf函数自己输入了一个‘10’,作为数组的第一项,出问题的语句已经用红色标出,求大神解释#include <stdio.h>
#define MaxVertaxNum 100
typedef char VertaxType;//定义顶点元素类型
typedef int EdgeType; //权值类型
typedef struct
{
VertaxType Vex;
EdgeType Edge;
int vexnum,arcnum;
}MGraph;
void CreateMGraph(MGraph *G)
{
int i,j,k;
VertaxType v1,v2;
EdgeType num;
printf("输入顶点数和边数:");
scanf("%d%d",&G->vexnum,&G->arcnum);
printf("依次输入顶点:");
for(k=0;k<G->vexnum;k++)
{
scanf("%c",&G->Vex);
}
for(i=0;i<G->vexnum;i++)
{
for(j=0;j<G->vexnum;j++)
{
G->Edge=0;
}
}
for(k=0;k<G->vexnum;k++)
{
printf("输入边的起点 终点 权值:");
scanf("%c%c%d",&v1,&v2,&num);
i=LocateVex(v1,G);
j=LocateVex(v2,G);
if(-1==i || -1==j)
{
k--;
continue;
}
G->Edge=num;
G->Edge=num;//无向图
}
}
int LocateVex(VertaxType v,MGraph *G)
{
int i;
for(i=0;i<G->vexnum;i++)
{
if(v==G->Vex)
return i;
}
printf("顶点不存在!\n");
return -1;
}
void main()
{
MGraph G;
CreateMGraph(&G);
}
执行这句scanf("%d%d",&G->vexnum,&G->arcnum);的时候,你输入完数据,按了下回车键,scanf 会保留回车在缓冲区,所以当你执行下一个scanf时,它就会先把Enter给放进去了,我说的也不好,具体的你可以上网查查,其中一种解决办法是可以在scanf后加上getchar(); 好多地方有错,你直接运行上面代码是运行不了的,我修改了一下,你可以试着运行一下,自己再修改一下
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define MaxVertaxNum 100
typedef char VertaxType;//定义顶点元素类型
typedef int EdgeType; //权值类型
typedef struct
{
VertaxType Vex;
EdgeType Edge;
int vexnum,arcnum;
}MGraph;
int LocateVex(VertaxType v,MGraph *G)
{
int i;
for(i=0;i<G->vexnum;i++)
{
if(v==G->vexnum)
return i;
}
printf("顶点不存在!\n");
return -1;
}
void CreateMGraph(MGraph *G)
{
int i,j,k;
VertaxType v1,v2;
EdgeType num;
printf("输入顶点数和边数:");
scanf("%d%d",&G->vexnum,&G->arcnum);
printf("依次输入顶点:");
for(k=0;k<G->vexnum;k++)
{
scanf("%c",&G->Vex);
}
for(i=0;i<G->vexnum;i++)
{
for(j=0;j<G->vexnum;j++)
{
G->Edge=0;
}
}
for(k=0;k<G->vexnum;k++)
{
printf("输入边的起点 终点 权值:");
scanf("%c%c%d",&v1,&v2,&num);
i=LocateVex(v1,G);
j=LocateVex(v2,G);
if(-1==i || -1==j)
{
k--;
continue;
}
G->Edge=num;//无向图
}
}
int main()
{
MGraph G;
CreateMGraph(&G);
return 0;
}
木、又 发表于 2014-5-15 11:26 static/image/common/back.gif
执行这句的时候,你输入完数据,按了下回车键,scanf 会保留回车在缓冲区,所以当你执行下一个scanf时,它就 ...
哈哈,getchar好像有两个参数 木、又 发表于 2014-5-15 11:26 static/image/common/back.gif
执行这句的时候,你输入完数据,按了下回车键,scanf 会保留回车在缓冲区,所以当你执行下一个scanf时,它就 ...
我是来赚鱼币的哈哈 永远前进的人 发表于 2014-5-16 21:46 static/image/common/back.gif
哈哈,getchar好像有两个参数
可能你回车读进去了
你加个函数:
fflush(stdin);把缓冲区清一次。
或者:
getchar();把回车读掉。
再或者可以这样:
int ch;
while((ch = getchar()) != '\n')
continue;把午剩下的多余内容去掉, 使在下次读入数据时不出错。
不知说得有没有错, 反正我是这么做的。
页:
[1]