有没有可能在读取一个字符的时候出现编码错误?
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(如果i
是signed int
),scanf
将改变errno
的值。
但是如果我尝试读取一个字符,就像这样:
scanf("%c", &c);
是否可以输入导致编码错误的字符?我用 UTF-8 输入测试过它,但效果很好(对于 ௮
,c
的十进制代码是 -32
,但 errno
是 0
).
首先,您需要对宽字符使用不同的转换说明符:
wchar_t c;
scanf("%lc", &c);
你的问题的答案是"yes",你应该经常检查输入是否有效!
用户可能无法键入无效字符(键盘只能产生有效字符),但输入可以来自其他来源,并且在大多数情况下你无法提前预测这些。也有可能输入的字符集与您的程序认为的不匹配(在这种情况下您会遇到更大的问题,但检查无效编码将有助于更快地发现问题)。
在任何情况下,检查 scanf
的 return 值的方法与检查 malloc
的 return 值的方法相同(您 做 做那个,对吧?)
if (scanf("%lc", &c) != 1)
emit_input_error_and_abort();
If an encoding error happens interpreting wide characters, the function sets errno to EILSEQ.
scanf("%d", &i);
如果输入大于2147483648(如果i
是signed int
),scanf
将改变errno
的值。
但是如果我尝试读取一个字符,就像这样:
scanf("%c", &c);
是否可以输入导致编码错误的字符?我用 UTF-8 输入测试过它,但效果很好(对于 ௮
,c
的十进制代码是 -32
,但 errno
是 0
).
首先,您需要对宽字符使用不同的转换说明符:
wchar_t c;
scanf("%lc", &c);
你的问题的答案是"yes",你应该经常检查输入是否有效!
用户可能无法键入无效字符(键盘只能产生有效字符),但输入可以来自其他来源,并且在大多数情况下你无法提前预测这些。也有可能输入的字符集与您的程序认为的不匹配(在这种情况下您会遇到更大的问题,但检查无效编码将有助于更快地发现问题)。
在任何情况下,检查 scanf
的 return 值的方法与检查 malloc
的 return 值的方法相同(您 做 做那个,对吧?)
if (scanf("%lc", &c) != 1)
emit_input_error_and_abort();