c语言,两端一模一样的代码,但是有空格就可以正常运行,没有便不行,是为什么

两段一模一样的代码,前者因为scanf函数里多一个空格就可以正常运行,后者少了就不行

#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 100
//无向图的邻接矩阵
typedef struct
{
    char data[MAXSIZE];//顶点数组
    int arc[MAXSIZE][MAXSIZE];//邻接矩阵
    int vexnum;
    int edgenum;//当前的定点数和边数
}Gragh;
//图的邻接矩阵的创建
void CreateMgragg(Gragh *g)
{
    int i,j,k;
    printf("请输入点和边的个数:");
    scanf("%d %d",&g->vexnum,&g->edgenum);
    printf("请输入所有点的信息:");
    for(i=0;i<g->vexnum;i++){
        scanf(" %c",&g->data[i]);
    }
    for(i=0;i<g->vexnum;i++){
        for(j=0;j<g->vexnum;j++){
            g->arc[i][j]=0;
        }
    }
    
    for (k=0; k < g->edgenum; k++)
    {
        printf("请输入第%d条边的两个顶点,各式(i j):",k+1);
        scanf("%d %d", &i, &j);
        g->arc[i][j] = 1;
        g->arc[j][i] = 1;//???????????
    }

}
void grint(Gragh g)
{
    int i,j;
    for (i = 0; i < g.vexnum; i++)
    {
        for (j = 0; j < g.vexnum; j++)
        {
            printf("%-3d", g.arc[i][j]);
        }
        printf("\n");
    }
}
int main()
{
    Gragh g;
    CreateMgragg(&g);
    grint(g);
    return 0;
}

img


```c

#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 100
//无向图的邻接矩阵
typedef struct
{
    char data[MAXSIZE];//顶点数组
    int arc[MAXSIZE][MAXSIZE];//邻接矩阵
    int vexnum;
    int edgenum;//当前的定点数和边数
}Gragh;
//图的邻接矩阵的创建
void CreateMgragg(Gragh *g)
{
    int i,j,k;
    printf("请输入点和边的个数:");
    scanf("%d %d",&g->vexnum,&g->edgenum);
    printf("请输入所有点的信息:");
    for(i=0;i<g->vexnum;i++){
        scanf("%c",&g->data[i]);
    }
    for(i=0;i<g->vexnum;i++){
        for(j=0;j<g->vexnum;j++){
            g->arc[i][j]=0;
        }
    }
    
    for (k=0; k < g->edgenum; k++)
    {
        printf("请输入第%d条边的两个顶点,各式(i j):",k+1);
        scanf("%d %d", &i, &j);
        g->arc[i][j] = 1;
        g->arc[j][i] = 1;//???????????
    }

}
void grint(Gragh g)
{
    int i,j;
    for (i = 0; i < g.vexnum; i++)
    {
        for (j = 0; j < g.vexnum; j++)
        {
            printf("%-3d", g.arc[i][j]);
        }
        printf("\n");
    }
}
int main()
{
    Gragh g;
    CreateMgragg(&g);
    grint(g);
    return 0;
}

img

两段的差异就在20行的scanf函数,为什么会产生这样的结果

fflush(stdin); //可能是缓冲区还有多余的字符,比如说回车,加上这个看看
scanf("%c",&g->data[i]);

需要忽略掉前一个回车,你看看这个

scanf()函数和回车的处理_scanf能读取回车吗_敲代码的布莱恩特的博客-CSDN博客 c语言中在读取键盘数据时,一般是带缓存的数据输入,需要按回车键才能完成该“行”数据的输入确认。而 scanf()函数对这个回车确认符并不进行处理,回车符会留在输入缓存区中。因此,在下一个读“字符”操作函数(getchar, scanf("%c"), gets()等)运行时,会读到这个字符。而在读数值型数据或字符串时,scanf()会从第一个非空白字符(空白字符指:回车,空格,TAB键)开始读取,自动忽略前面的空白字符,而遇到空白字符结束该类型数据的输入。因此,是否一定要在scanf后面跟个 getc https://blog.csdn.net/DerrickWestbrook/article/details/118230961