这里为什么我输完y之后,它就弹出了这样的错误?

这里为什么我输完y之后,它就弹出了这样的错误?
%[^\n]我是想让scanf缓存区读取到\n结束,然后再加个%*c让scanf把\n读取掉,最后%c读取给j

img


img

这句这么改:scanf(" %c", &j); %c前面留一空格

是因为缓冲区中尚未读取的字符已经被读取并放在了变量j中!
 
当输入y并按下回车时,scanf函数将读取字符’y’和换行符’\n’。然后,%[^\n]格式指示符将读取所有除换行符之外的字符并将其放入缓冲区中,但是换行符’\n’仍然留在缓冲区中等待读取。
 
接下来,%*c格式指示符将读取并忽略换行符’\n’。最后,%c格式指示符将读取下一个字符,即缓冲区中仍然存在的字符,即换行符’\n’,并将其存储在变量j中。
 
所以,在你运行程序并输入y时,scanf函数将读取字符’y’、换行符’\n’和换行符’\n’,并将后一个换行符存储在j中。根据你的程序逻辑,在下一次循环中,scanf将尝试读取一个整数,但实际上它读取的是一个换行符,这会导致错误的输出结果。
 
要避免这种错误,可以在格式字符串中使用空格字符来丢弃在之前读取的换行符,如下所示:
 


scanf(" %c%*c%c", &op, &j);

或者使用fgets函数读取整个输入行并检查输入是否有效。。。。。。
 

img


最近更新