有没有可能在读取一个字符的时候出现编码错误?

Is it possible there will be an encoding error when reading a character?

If an encoding error happens interpreting wide characters, the function sets errno to EILSEQ.

scanf("%d", &i);

如果输入大于2147483648(如果isigned int),scanf将改变errno的值。

但是如果我尝试读取一个字符,就像这样:

scanf("%c", &c);

是否可以输入导致编码错误的字符?我用 UTF-8 输入测试过它,但效果很好(对于 c 的十进制代码是 -32,但 errno0).

首先,您需要对宽字符使用不同的转换说明符:

wchar_t c;
scanf("%lc", &c);

你的问题的答案是"yes",你应该经常检查输入是否有效!

用户可能无法键入无效字符(键盘只能产生有效字符),但输入可以来自其他来源,并且在大多数情况下你无法提前预测这些。也有可能输入的字符集与您的程序认为的不匹配(在这种情况下您会遇到更大的问题,但检查无效编码将有助于更快地发现问题)。

在任何情况下,检查 scanf 的 return 值的方法与检查 malloc 的 return 值的方法相同(您 做那个,对吧?)

if (scanf("%lc", &c) != 1)
  emit_input_error_and_abort();