猿问

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

/* #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 *
***************************************************/


乔巴之无所不能
浏览 1855回答 2
2回答

onemoo

你上一次输入的最后按了回车吧。这个换行符也留在输入流中。scanf 的格式化字符串中的 %c 会匹配输入流中的任何一个字符,所以这次 scanf("%c",&ch) 会读到 '\n' 并存入 ch 中。scanf 的格式化字符串中的空格会匹配输入流中的任何空白字符。所以在 %c 前加上空格,这个空格就会把之前留下的那个换行符匹配走(或者说消耗掉了那个换行符)。后面的 %c 就能正常读到你需要的字符了。在连续使用 scanf("%c ... 时一定要注意这个问题。其实 scanf("%lf"... 也是在两次输入之间,但它不会有这个问题。这是因为其他的格式化指示符(如%lf)会忽略输入流中的空白字符、直接去找后面有意义的字符。

乔巴之无所不能

修改:scanf("%c",&ch); while(getchar() != '\n') /* empty loop body*/;变为:scanf(" %c",&ch); while(getchar() != '\n') /* empty loop body*/;在%c之前加了一个空格。程序就能正常运行了。但是这是为什么?
随时随地看视频慕课网APP
我要回答