scanf(&G->vexs[i]);为什么里面没有“%d”之类的东西还能通过编译
时间: 2024-04-08 22:32:03 浏览: 15
scanf函数中的第一个参数是格式控制字符串,它指定了输入的格式。在你提供的代码中,scanf函数的参数是&G->vexs[i],这是一个指针,用于将输入的值存储到G->vexs[i]中。
scanf函数的格式控制字符串中可以使用转换说明符来指定输入的数据类型。例如,"%d"表示输入一个整数,"%f"表示输入一个浮点数,"%c"表示输入一个字符等。在你提供的代码中,没有看到使用转换说明符的情况。
这可能是因为你在其他地方已经明确了G->vexs[i]的数据类型,所以在这里不需要使用转换说明符。或者你可能是通过其他方式来确定输入的数据类型,而不是使用scanf函数。
不过,请注意,在实际开发中,为了确保输入的完整性和正确性,最好在格式控制字符串中使用适当的转换说明符,以匹配输入的数据类型。
相关问题
void CreateMGraph(MGraph* G) { int i, j, k, w; char a, b; printf("输入顶点数和边数:\n"); scanf("%d,%d", &G->numNodes, &G->numEdges); /* 输入顶点数和边数 */ printf("输入顶点信息:\n"); fflush(stdin); for (i = 0; i < G->numNodes; i++) /* 读入顶点信息,建立顶点表 */ scanf("%c", &G->vexs[i]); for (i = 0; i < G->numNodes; i++) for (j = 0; j < G->numNodes; j++) G->arc[i][j] = GRAPH_INFINITY; /* 邻接矩阵初始化 */ fflush(stdin); for (k = 0; k < G->numEdges; k++) /* 读入numEdges条边,建立邻接矩阵 */ { printf("输入第%d条边(格式为:顶点a,顶点b,权值)\n ",k+1); scanf("%c %c %d",&a,&b,&w); for (i=0;i<G->numNodes; i++) { for(j = 0; j<G->numNodes; j++) { if(G->vexs[i] ==a&&G->vexs[j]==b) { G->arc[i][j]=w; G->arc[j][i]=w; } } } } } void print(MGraph* G) { int i, j; for (i = 0; i < G->numNodes; i++) { for (j = 0; j < G->numNodes; j++) printf("%4d", G->arc[i][j]); printf("\n"); } } int main() { MGraph G; CreateMGraph(&G); print(&G); return 0; } 本段代码错误点在哪修改
本段代码的错误在于输入顶点信息时,使用了 scanf() 函数读取字符,但是在输入完顶点数和边数后,输入缓冲区中可能会残留一个换行符,导致输入顶点信息时会先读取到这个换行符,而不是用户输入的第一个字符。为了解决这个问题,可以在读取顶点信息前先用 getchar() 函数读取掉输入缓冲区中的换行符,代码修改如下:
```c
void CreateMGraph(MGraph* G) {
int i, j, k, w;
char a, b;
printf("输入顶点数和边数:\n");
scanf("%d,%d", &G->numNodes, &G->numEdges); /* 输入顶点数和边数 */
printf("输入顶点信息:\n");
getchar(); // 读取掉输入缓冲区中的换行符
for (i = 0; i < G->numNodes; i++) /* 读入顶点信息,建立顶点表 */
scanf("%c", &G->vexs[i]);
for (i = 0; i < G->numNodes; i++)
for (j = 0; j < G->numNodes; j++)
G->arc[i][j] = GRAPH_INFINITY; /* 邻接矩阵初始化 */
fflush(stdin);
for (k = 0; k < G->numEdges; k++) /* 读入numEdges条边,建立邻接矩阵 */
{
printf("输入第%d条边(格式为:顶点a,顶点b,权值)\n ",k+1);
scanf(" %c %c %d", &a, &b, &w); // 在格式字符串前加空格,将之前的换行符读取掉
for (i = 0; i < G->numNodes; i++) {
for(j = 0; j < G->numNodes; j++) {
if(G->vexs[i] == a && G->vexs[j] == b) {
G->arc[i][j] = w;
G->arc[j][i] = w;
}
}
}
}
}
```
另外,建议在输入完顶点数和边数后,也加上一个 getchar() 函数,将输入缓冲区中的换行符读取掉,以免对后面的输入造成影响。
将这段代码修改为正确的格式 #include <stdio.h>#include <stdlib.h>#include <conio.h>#define MAX 20typedef int VexType;typedef int WeightType; // 边的权值类型typedef struct { VexType vex; // 顶点数据 WeightType w; // 边的权值} Edge;typedef struct { VexType vexs[MAX]; // 顶点数组 Edge edges[MAX * MAX]; // 边数组 int n, e; // 顶点数和边数} MGraph;void creat_mg(MGraph *G);void out_mg(MGraph *G);MGraph G1;int main(){ creat_mg(&G1); out_mg(&G1); return 0;}void creat_mg(MGraph *G){ int i, j, k, w; printf("\n n,e=?"); scanf("%d%d", &(G->n), &(G->e)); for (i = 0; i < G->n; i++) { printf("\n 请输入第%d个顶点的数据: ", i + 1); scanf("%d", &(G->vexs[i])); } for (k = 0; k < G->e; k++) { printf("\n 请输入第%d条边的起点、终点和权值: ", k + 1); scanf("%d%d%d", &i, &j, &w); G->edges[k].vex = j - 1; G->edges[k].w = w; G->edges[k].next = G->vexs[i - 1].firstedge; G->vexs[i - 1].firstedge = &(G->edges[k]); }}void out_mg(MGraph *G){ int i, j; Edge *e; printf("\n邻接表如下:\n"); for (i = 0; i < G->n; i++) { printf("%d: ", G->vexs[i].vex); e = G->vexs[i].firstedge; while (e != NULL) { printf("%d(%d) ", e->vex, e->w); e = e->next; } printf("\n"); } printf("\n存在的边如下:\n"); for (i = 0; i < G->n; i++) { e = G->vexs[i].firstedge; while (e != NULL) { j = e->vex; printf("%d %d %d\n", G->vexs[i].vex, G->vexs[j].vex, e->w); e = e->next; } } printf("\n\n 打回车键,继续。"); getch();}
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#define MAX 20
typedef int VexType;
typedef int WeightType; // 边的权值类型
typedef struct Edge {
int vex; // 顶点数据
WeightType w; // 边的权值
struct Edge *next; // 下一条边
} Edge;
typedef struct {
VexType vexs[MAX]; // 顶点数组
Edge edges[MAX * MAX]; // 边数组
int n, e; // 顶点数和边数
} MGraph;
void creat_mg(MGraph *G);
void out_mg(MGraph *G);
MGraph G1;
int main(){
creat_mg(&G1);
out_mg(&G1);
return 0;
}
void creat_mg(MGraph *G){
int i, j, k, w;
printf("\n n,e=?");
scanf("%d%d", &(G->n), &(G->e));
for (i = 0; i < G->n; i++) {
printf("\n 请输入第%d个顶点的数据: ", i + 1);
scanf("%d", &(G->vexs[i]));
}
for (k = 0; k < G->e; k++) {
printf("\n 请输入第%d条边的起点、终点和权值: ", k + 1);
scanf("%d%d%d", &i, &j, &w);
G->edges[k].vex = j - 1;
G->edges[k].w = w;
G->edges[k].next = G->vexs[i - 1].firstedge;
G->vexs[i - 1].firstedge = &(G->edges[k]);
}
}
void out_mg(MGraph *G){
int i, j;
Edge *e;
printf("\n邻接表如下:\n");
for (i = 0; i < G->n; i++) {
printf("%d: ", G->vexs[i]);
e = G->vexs[i].firstedge;
while (e != NULL) {
printf("%d(%d) ", e->vex, e->w);
e = e->next;
}
printf("\n");
}
printf("\n存在的边如下:\n");
for (i = 0; i < G->n; i++) {
e = G->vexs[i].firstedge;
while (e != NULL) {
j = e->vex;
printf("%d %d %d\n", G->vexs[i], G->vexs[j], e->w);
e = e->next;
}
}
printf("\n\n 打回车键,继续。");
getch();
}