/* #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)会忽略输入流中的空白字符、直接去找后面有意义的字符。
乔巴之无所不能
TA贡献4条经验 获得超1个赞
修改:
scanf("%c",&ch); while(getchar() != '\n') /* empty loop body*/;
变为:
scanf(" %c",&ch); while(getchar() != '\n') /* empty loop body*/;
在%c之前加了一个空格。程序就能正常运行了。
但是这是为什么?
- 2 回答
- 0 关注
- 1854 浏览
添加回答
举报
0/150
提交
取消