我试图制作一个简单的程序来计算平均GPA,但在输出过程中,语句不应该在它们应该停止时停止。我不认为printf语句中的缓冲区存在任何问题,因为我在每个句子中都使用了新行。这在输出中例如:
Enter a GPA:
9
Do you want to calculate the average GPA until now?
Press 'y' for yes or 'n' for no:
Enter a GPA:
y
Do you want to calculate the average GPA until now?
Press 'y' for yes or 'n' for no:
The average GPA is 9.0
正如你所看到的那样循环继续,它再次打印出问题。
我做错了什么?
这是我的代码:
#include <stdio.h>
int main(void){
/*************************Variable declarations************************/
float fGPA;
float fUserInput = 0;
float fArray[30];
int x;
char cYesNo = '\0';
/*************************Initialize array********************************/
for(x = 0; x < 30; x++){
fGPA = 0;
printf("Enter a GPA: \n");
scanf("%f", &fUserInput);
fArray[x] = fUserInput;
fGPA += fUserInput;
printf("Do you want to calculate the average GPA until now?\n");
printf("Press 'y' for yes or 'n' for no: \n");
scanf("%c", &cYesNo);
if(cYesNo == 'y' || cYesNo == 'Y')
break;
else if(cYesNo == 'n' || cYesNo == 'N')
continue;
}//End for loop
printf("The average GPA is %.1f\n", fGPA / x);
}//End main
答案 0 :(得分:3)
<强>原因:强>
这是因为白色空格,即输入'\n'
fUserInput
字符
scanf("%f", &fUserInput);
此'\n'
由%c
scanf("%c", &cYesNo);
使用
<强>解决方案:强>
通过在%c
扫描cYesNo
之前提供一个空格以消耗任何空格来避免它
scanf(" %c", &cYesNo);
为什么要留出空间?
通过提供空格,编译器会消耗
'\n'
个字符或任何其他空格('\0'
,'\t'
或' '
) 之前的scanf()
<强>建议强>
下次如果遇到这样的问题...尝试以这种方式打印字符扫描的ascii values
:
printf("%d",(int)cYesNo); //casting char->int
并根据ascii表检查输出:here
例如:
32
' ' //space
10
'\n' //new-line
9
// horizontal-tab '\t'
通过这种方式你可以知道被扫描到角色中的是什么,如果它是whitespace
通过上述方法避免它:)
答案 1 :(得分:3)
您需要替换
scanf("%c", &cYesNo);
通过
scanf(" %c", &cYesNo);
由于此处详细说明的原因:How to do scanf for single char in C