我想知道它的缺点scanf().
在许多站点中,我已经读过使用scanf可能导致缓冲区溢出.这是什么原因?还有其他缺点scanf吗?
我刚刚阅读 glibcsscanf 手册页(来自 Linux 手册页包),发现了以下内容:
\n\n可以使用以下转换说明符:
\n
\n(...)\n
d\xc2\xa0\xc2\xa0 已弃用。匹配一个可选的有符号十进制整数;\nnext 指针必须是指向 的指针int。\n
i\xc2\xa0\xc2\xa0 已弃用。匹配一个可选的有符号整数;next\n指针必须是指向 的指针int。如果整数以 或 开头,则以 16 为基数读取0x;0X如果以 开头,则以 8 为基数读取0;否则以 10 为基数读取。仅使用与\n基数相对应的字符。\n
o\xc2\xa0\xc2\xa0 已弃用。匹配无符号八进制整数;下一个指针\n必须是指向 的指针unsigned int。(...)
\n
%d被废弃了呢?似乎所有int说明符都已弃用。我已经尝试了scanf("%u",&number),我输入了负数,问题就在于printf("%d",number)我得到负数.我以为这会阻止我阅读负数.是scanf("%d",&number)和scanf("%u",&number)真的一样吗?或者只是为了可读性.
我在做一些叫做未定义行为的事情吗?
编辑:
从维基百科我读到这个:
%u:扫描十进制无符号整数(注意,在C99标准中,输入值减号是可选的,因此如果读取减号,则不会出现错误,结果将是负数的二进制补码,可能是非常大的价值.
阅读SO答案及以上,有点令人困惑.有人能说得更清楚吗?