您有3个 Select :
atoi
个
如果您在性能关键型代码中使用它,这可能是最快的,但是它不会报告错误.如果字符串不是以整数开头,则返回0.如果字符串在整数后包含垃圾,它将转换初始部分并忽略睡觉.如果数字太大而无法容纳int
,则行为未指定.
sscanf
一些错误报告,并且对于存储什么类型(char/short/int/long/long long/size_t/ptrdiff_t/intmax_t
的签名/未签名版本)有很大的灵活性.
返回值是成功的转换数,因此如果字符串不是以整数开头,则扫描"%d"
将返回0.您可以使用"%d%n"
来存储在另一个变量中读取的整数之后的第一个字符的索引,从而判断整个字符串是否已转换,或者之后是否有垃圾.然而,像atoi
个一样,整数溢出的行为是未指定的.
strtol
和家庭
强大的错误报告功能,前提是在通话前将errno
设置为0.返回值在溢出时指定,并将设置为errno
.您可以 Select 2到36之间的任何数字基数,或者指定0作为基数,以分别将前导0x
和0
自动解释为十六进制和八进制.要转换为的类型 Select 是long/long long/intmax_t
的有符号/无符号版本.
如果您需要较小的类型,您可以始终将结果存储在一个临时的long
或unsigned long
变量中,并自己判断是否有溢出.
由于这些函数接受指向指针参数的指针,因此您还可以免费获得指向转换后的整数后面的第一个字符的指针,因此您可以判断整个字符串是否为整数,或者在需要时解析字符串中的后续数据.
就我个人而言,我会推荐strtol
个家庭用于most个目的.如果你正在做一些快速和肮脏的事情,Atoi可能会满足你的需求.
顺便说一句,有时我发现我需要解析一些不应该接受前导空格、符号等的数字.在这种情况下,你可以很容易地实现自己的for循环,例如.,
for (x=0; (unsigned)*s-'0'<10; s++)
x=10*x+(*s-'0');
或者你可以使用(为了稳健性):
if (isdigit(*s))
x=strtol(s, &s, 10);
else /* error */