首页 > 解决方案 > 在 getchar() 之后使用 fgets()

问题描述

void
read_stdin(trace_t* trace, state_t state, action_t** action_list) {
    // initial stage
    int c;
    while ((c = getchar())!= EOF && c!='#') {
        if (my_isalpha(c)==LOWERCASE) {
            state[c-ASCII_CODE_LOWER_A] = '1';
        }
    }
    printf("%s\n", state);

    char str[2];
    fgets(str, 2, stdin);
    printf("%s", str);
}

如果 '#' 是我在 getchar() 循环中输入的最后一个字符,则 fgets() 会记录我按 enter 时的换行符并立即跳到 print 语句(打印 '\n')

我可以通过添加一个额外的 fgets() 来解决这个问题(由于某种原因,它必须有一个比 1 个字符长的字符串?)但是有没有更优雅的方法来解决这个问题?

标签: cinputfgetsgetchar

解决方案


好吧,您可以使用scanf("%*[\n]");忽略任意数量的连续换行符。或者scanf("%*1[\n]");只吃一个换行符。如果任何其他字符是第一个字符,则不会消耗它。

另一种选择是使用低级操作getcharungetc

int eat_stdin_newline(void) {
    int ch = getchar();
    if (ch != EOF && ch != '\n') {
        // if it wasn't EOF or newline, push it back...
        ungetc(ch, stdin); // must succeed
    }
    return ch;
}

然后你可以在任何你想要的地方调用这个函数:

eat_stdin_newline();

推荐阅读