【问题标题】:C code missing getchar() command in while loop first time roundC 代码在第一次循环中缺少 getchar() 命令
【发布时间】:2015-10-01 20:00:48
【问题描述】:

我正在用 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();
        }
    }
} 

【问题讨论】:

  • 第一个getchar 消耗换行符?喜欢逐行阅读。
  • 你按回车了吗?使用调试器查看它第一次读取的内容。

标签: c getchar


【解决方案1】:

'scanf' 使用后

getchar();

消耗额外的换行符。由于'scanf'不能丢弃换行符,'getchar();'的第一次迭代换行。

所以你应该在scanf 之后放置getchar() 以消耗额外的换行符('\n')

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

最好使用'fgets'而不是scanf,因为文件名可能有空格。 你可以使用'fgets()'作为

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

【讨论】:

  • 你应该解释为什么,而不仅仅是如何
  • 非常感谢!我忘了我需要刷新缓冲区!
  • 我的意思是:如果下一个字符不是换行符怎么办?
  • @AaronNebbs:不要想使用fflush(stdin)
  • @KarolyHorvath 这种情况下 'fgets` 是选择。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多