C代码在while循环第一次循环中缺少getchar()命令

时间:2015-10-01 20:00:49

标签: c getchar

我正在用C语言编写一个菜单系统,代码工作正常但是由于某种原因,第一次第一次为菜单输入while循环时它会跳过getchar()命令并再次运行while循环,但是第二次时间有效吗? 关于它为什么会这样做的任何想法?

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "structs.h"

int main(void) 
{
    FILE *fp = NULL;
    char fileName[25], line[200], userInput = ' ';
    int len;

    while (fp == NULL) 
    {
        printf("Enter The File To Load In: \n");
        scanf("%s", fileName); // Ask User For File Name
        fp = fopen(fileName, "r"); // Open File To Read
        if (fp == NULL) 
        {
            perror("Error While Loading File\n");
        }
    }

    while (userInput != 'g') 
    {   
        printf("        |User System|\n");
        printf("A) Save Current Data To A File\n");
        printf("B) Enter Details\n");
        printf("C) View Details\n");
        printf("D) Amend Details\n");
        printf("E) Search by Award Title\n");
        printf("F) Search by Surname\n");
        printf("G) Shut Down\n");
        userInput = getchar();

        if (userInput == 'c') 
        {
            fgets(line, 200, fp);
            len = strlen(line);
            printf("%s", line);
            userInput = getchar();
        }
    }
} 

1 个答案:

答案 0 :(得分:0)

&#39; scanf&#39;使用

getchar();

消耗额外的换行符。作为&#39; scanf&#39;不能丢弃换行符,第一次迭代“getchar();&#39;拿新线。

所以你在getchar()之后将scanf放在一边,以便消耗额外的换行符(&#39; \ n&#39;)

scanf("%s", fileName);
getchar();

最好使用&#39; fgets&#39;而不是scanf,因为文件名可能有空格。 你可以使用&#39; fgets()&#39;如

fgets(fileName, sizeof(fileName), stdin);
fileName[strlen(fileName)-1] = 0; //Replace newline with '\0' character