c - 在 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 个字符长的字符串?)但是有没有更优雅的方法来解决这个问题?
解决方案
好吧,您可以使用scanf("%*[\n]");
忽略任意数量的连续换行符。或者scanf("%*1[\n]");
只吃一个换行符。如果任何其他字符是第一个字符,则不会消耗它。
另一种选择是使用低级操作getchar
和ungetc
:
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();
推荐阅读
- python-3.x - Python子图和图像大小
- android - 如何在 Android 布局文件中获得两个带有下拉菜单的选项?
- netbeans - NetBeans -- 不代表有效的 javafx Scene Builder 安装
- flutter - Flutter,TextFormField 的内容填充无法正常工作?
- c - C语言中两个数字的32位加法
- javascript - 根据其他单选按钮的值更改单选按钮
- c - 用 C 编写的代码的递归到迭代转换
- html - 响应式网格
- python - 如果洗牌,这个 5-d numpy 数组几乎不占用 RAM
- c++ - 如何使用代码块在 C++ 中连接实时数据库