为了账号安全,请及时绑定邮箱和手机立即绑定

请大家帮我看看这个C程序为什么不能第二次进入主循环?

请大家帮我看看这个C程序为什么不能第二次进入主循环?

C
乔巴之无所不能 2017-10-22 10:50:56
/* #include directives */ #include <stdio.h>  #include <stdbool.h> /* #define directives */ #define N 10 /* declarations of exteral variables */ /* empty exteral variables */ /* prototypes */ void avg_sum(double a[], int n, double *avg, double *sum); void print(const double *avg, const double *sum); /*************************************************** * main: calls avg_sum, print;                      * *                                                  * ***************************************************/  int main(void) { double array[N], avg, sum; int i; for( ; ;) { char ch; printf("\n\n\tgo to main(y/n):"); scanf("%c",&ch); while(getchar() != '\n') /* empty loop body*/; if(ch == 'y' ||ch == 'Y') { printf("\n\n\tEnter %d of double number: ",N); for(i = 0; i < N; i++) scanf("%lf",&array[i]); avg_sum(array, N, &avg, &sum); print(&avg, &sum); } else break; } return 0; } /*************************************************** * functions: avg_sum, print                        * *                                                  * ***************************************************/ void avg_sum(double a[], int n, double *avg, double *sum) { int i; *sum = 0; for(i = 0; i < n; i++) *sum += a[i]; *avg = *sum / n; return; } void print(const double *avg, const double *sum) { printf("\n\n\tavg = %g",*avg); printf("\n\n\tsum = %g",*sum); return; } /*************************************************** *   test point * ***************************************************/
查看完整描述

2 回答

已采纳
?
onemoo

TA贡献883条经验 获得超454个赞

你上一次输入的最后按了回车吧。这个换行符也留在输入流中。

scanf 的格式化字符串中的 %c 会匹配输入流中的任何一个字符,所以这次 scanf("%c",&ch) 会读到 '\n' 并存入 ch 中。

scanf 的格式化字符串中的空格会匹配输入流中的任何空白字符所以在 %c 前加上空格,这个空格就会把之前留下的那个换行符匹配走(或者说消耗掉了那个换行符)。后面的 %c 就能正常读到你需要的字符了。

在连续使用 scanf("%c ... 时一定要注意这个问题。


其实 scanf("%lf"... 也是在两次输入之间,但它不会有这个问题。这是因为其他的格式化指示符(如%lf)会忽略输入流中的空白字符、直接去找后面有意义的字符。

查看完整回答
反对 回复 2017-10-22
?
乔巴之无所不能

TA贡献4条经验 获得超1个赞

修改:

scanf("%c",&ch);
while(getchar() != '\n')
/* empty loop body*/;

变为:

scanf(" %c",&ch);
while(getchar() != '\n')
/* empty loop body*/;

在%c之前加了一个空格。程序就能正常运行了。

但是这是为什么?

查看完整回答
反对 回复 2017-10-22
  • 2 回答
  • 0 关注
  • 1801 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信