鱼C论坛

 找回密码
 立即注册
查看: 2946|回复: 5

scanf输入字母,自动输入一个‘10’,是为什么?

[复制链接]
发表于 2014-4-15 15:38:56 | 显示全部楼层 |阅读模式
10鱼币
写的一个创建邻接矩阵的程序,在输入顶点表的时候scanf函数自己输入了一个‘10’,作为数组的第一项,出问题的语句已经用红色标出,求大神解释

#include <stdio.h>

#define MaxVertaxNum 100
typedef char VertaxType;  //定义顶点元素类型
typedef int EdgeType;     //权值类型

typedef struct
{
        VertaxType Vex[MaxVertaxNum];
        EdgeType Edge[MaxVertaxNum][MaxVertaxNum];
        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[k]);
        }
        for(i=0;i<G->vexnum;i++)
        {
                for(j=0;j<G->vexnum;j++)
                {
                        G->Edge[i][j]=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[i][j]=num;
                G->Edge[j][i]=num;//无向图
        }
}

int LocateVex(VertaxType v,MGraph *G)
{
        int i;
        for(i=0;i<G->vexnum;i++)
        {
                if(v==G->Vex[i])
                        return i;
        }
        printf("顶点不存在!\n");
        return -1;
}

void main()
{
        MGraph G;
        CreateMGraph(&G);
}

最佳答案

查看完整内容

执行这句的时候,你输入完数据,按了下回车键,scanf 会保留回车在缓冲区,所以当你执行下一个scanf时,它就会先把Enter给放进去了,我说的也不好,具体的你可以上网查查,其中一种解决办法是可以在scanf后加上
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-4-15 15:38:57 | 显示全部楼层
执行这句
scanf("%d%d",&G->vexnum,&G->arcnum);
的时候,你输入完数据,按了下回车键,scanf 会保留回车在缓冲区,所以当你执行下一个scanf时,它就会先把Enter给放进去了,我说的也不好,具体的你可以上网查查,其中一种解决办法是可以在scanf后加上
getchar(); 
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-4-15 18:38:17 | 显示全部楼层
好多地方有错,你直接运行上面代码是运行不了的,我修改了一下,你可以试着运行一下,自己再修改一下

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

#define MaxVertaxNum 100

typedef char VertaxType;  //定义顶点元素类型
typedef int EdgeType;     //权值类型

typedef struct
{
         VertaxType Vex[MaxVertaxNum];
         EdgeType Edge[MaxVertaxNum][MaxVertaxNum];
         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[k]);
         }
         for(i=0;i<G->vexnum;i++)
         {
                 for(j=0;j<G->vexnum;j++)
                 {
                         G->Edge[j][i]=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[j][i]=num;//无向图
        }
}



int main()
{
    MGraph G;
    CreateMGraph(&G);
   
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-5-16 21:46:29 | 显示全部楼层

哈哈,getchar好像有两个参数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-5-16 21:47:03 | 显示全部楼层
木、又 发表于 2014-5-15 11:26
执行这句的时候,你输入完数据,按了下回车键,scanf 会保留回车在缓冲区,所以当你执行下一个scanf时,它就 ...

我是来赚鱼币的哈哈
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-5-16 22:43:09 | 显示全部楼层
永远前进的人 发表于 2014-5-16 21:46
哈哈,getchar好像有两个参数

可能你回车读进去了
你加个函数:
fflush(stdin);
把缓冲区清一次。
或者:
getchar();
把回车读掉。
再或者可以这样:
int ch;
while((ch = getchar()) != '\n')
         continue;
把午剩下的多余内容去掉, 使在下次读入数据时不出错。
不知说得有没有错, 反正我是这么做的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-27 00:35

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表