在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个char的字符串传递给它)来解决此问题,但是有一种更优雅的解决方法吗?

解决方法

好吧,您可以使用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();

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...