洛熙封晨 发表于 2014-4-15 15:38:56

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);
}

木、又 发表于 2014-4-15 15:38:57

执行这句scanf("%d%d",&G->vexnum,&G->arcnum);的时候,你输入完数据,按了下回车键,scanf 会保留回车在缓冲区,所以当你执行下一个scanf时,它就会先把Enter给放进去了,我说的也不好,具体的你可以上网查查,其中一种解决办法是可以在scanf后加上getchar();

天使之约 发表于 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;
         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-16 21:46:29

木、又 发表于 2014-5-15 11:26 static/image/common/back.gif
执行这句的时候,你输入完数据,按了下回车键,scanf 会保留回车在缓冲区,所以当你执行下一个scanf时,它就 ...

哈哈,getchar好像有两个参数

永远前进的人 发表于 2014-5-16 21:47:03

木、又 发表于 2014-5-15 11:26 static/image/common/back.gif
执行这句的时候,你输入完数据,按了下回车键,scanf 会保留回车在缓冲区,所以当你执行下一个scanf时,它就 ...

我是来赚鱼币的哈哈

喜欢散步 发表于 2014-5-16 22:43:09

永远前进的人 发表于 2014-5-16 21:46 static/image/common/back.gif
哈哈,getchar好像有两个参数

可能你回车读进去了
你加个函数:
fflush(stdin);把缓冲区清一次。
或者:
getchar();把回车读掉。
再或者可以这样:
int ch;
while((ch = getchar()) != '\n')
         continue;把午剩下的多余内容去掉, 使在下次读入数据时不出错。
不知说得有没有错, 反正我是这么做的。
页: [1]
查看完整版本: scanf输入字母,自动输入一个‘10’,是为什么?