关于输入缓存区的问题(图的邻接矩阵)

Hhcz_2419948234 2017-12-14 10:37:16
Status CreateDG(MGraph *G) /* create digraph */
{
int i,j,k;
char v1,v2;

printf("Please input G.vernum,G.arcnum:");
scanf("%d,%d",&(*G).vexnum,&(*G).arcnum);

getchar(); 这里不加就会出错

printf("input vertex:");
for(i=0;i<(*G).vexnum;i++) /* create the array of vertex */
scanf("%c",&(*G).vexs[i]);
(*G).vexs[i]='\0';

for(i=0;i<(*G).vexnum;i++) /* initial the adjcent matrix */
for(j=0;j<(*G).vexnum;j++)
(*G).arcs[i][j].adj=0;

getchar(); 这里不加就会出错
for(k=0;k<(*G).arcnum;k++)
{
printf("Please input v1,v2 of arc:"); /* input a arc's message */
scanf("%c,%c",&v1,&v2);

getchar(); 这里不加就会出错
i=LocateVex(*G,v1); /* find the positon of v1,v2 in vexs*/
j=LocateVex(*G,v2);

(*G).arcs[i][j].adj=1; /* create the adjcent matrix */
}

return OK;
}
...全文
101 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
自信男孩 2017-12-15
  • 打赏
  • 举报
回复
首先标准输入缓存是属于行缓存,因此需要回车结束输入并将数据刷到内存里(若不回车,即输入换行符,输入的内容还在缓存里) 因此每次的输入要刷到内存,需要输入换行符,即回车;但是,回车不会跟着进入内存,它还会残留在输入缓存里,若是%d接收,那么这个换行符'\n'不会与它匹配,但是若是%c就会与之匹配,所以若不加getchar();就会让第一个%c接收上次输入之后残留在输入缓存里的换行符'\n',加上getchar();就是为了接收或者匹配输入缓存里的'\n'的。这样后面的%c就会匹配新输入的数据。 主要是%c是接收一个字符,'\n'正好是一个字符。
赵4老师 2017-12-15
  • 打赏
  • 举报
回复
在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。
//请今后要用
char c;
scanf("%c",&c);
//时,都改为
char s[2];
char c;
scanf("%1s",s);
c=s[0];
//自动跳过一个或多个空格或Tab字符或回车换行,读取下一个字符。
paschen 2017-12-14
  • 打赏
  • 举报
回复
getchar接收了上一次输出后留在缓冲区中的换行符\n,否则会被接下来的scanf("%c",&(*G).vexs[i]);接收了,也就是说如果不用getchar接收掉,后面scanf接收到的字符为\n

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧