【发布时间】:2014-05-22 07:41:10
【问题描述】:
即使字符串转换成功,测试errno会返回一个指示错误的值:
#include <stdlib.h>
#include <sys/errno.h>
const char* numberString = "7";
char* endPtr;
errno = 0;
long number = strtol(numberString, &endPtr, 10);
NSLog(@"%ld", number);
if (errno) {
perror("string to integer conversion failed");
}
输出是(在模拟器上,iOS 7)
$ 2014-05-22 09:27:32.954 Test[2144:60b] 7
$ string to integer conversion failed: No such process
设备上的行为类似。
strtol 的man page 在评论中说:
返回值
strtol()、strtoll()、strtoimax() 和 strtoq() 函数返回转换的结果, 除非该值会下溢或溢出。如果无法执行转换,则返回 0 并 全局变量 errno 设置为 EINVAL(最后一个功能不能在所有平台上移植)。如果 发生上溢或下溢,errno 设置为 ERANGE,函数返回值被钳位 根据下表。
目前还不清楚这对 iOS 究竟意味着什么。这里有什么见解吗?
编辑:
原来函数调用NSLog确实设置了errno。所以,@Mat 在他的回答中,cmets 说“在调用一个不相关的函数(这里是NSLog)之后测试errno 时,所有的赌注都被取消了。
【问题讨论】:
-
看起来
errno仅在strtol失败时才设置 - 因为strtol成功,那么您不应该尝试读取errno。
标签: ios objective-c errno strtol