问题描述
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]");
仅吃一个 换行符。如果第一个字符是其他任何字符,则不会使用。
另一种选择是使用低级操作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();