使用c语言的for循环和scanf问题

时间:2016-06-09 08:54:07

标签: c for-loop scanf

我试图制作一个简单的程序来计算平均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

2 个答案:

答案 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 // horizo​​ntal-tab
  • ,则输出为'\t'

通过这种方式你可以知道被扫描到角色中的是什么,如果它是whitespace通过上述方法避免它:)

答案 1 :(得分:3)

您需要替换

scanf("%c", &cYesNo);

通过

scanf(" %c", &cYesNo);

由于此处详细说明的原因:How to do scanf for single char in C