根据strtoul
的文档,关于其返回值...
如果我要解析用户提供的字符串“0”,对于我的应用程序,“0”可能是有效条目,该怎么办?在那种情况下,我似乎无法通过使用strtoul
来确定是否执行了有效的转换。还有另一种方法可以解决这个问题吗?
最佳答案
从strtoul()
返回的任何值都可以来自预期的字符串输入,也可以来自其他非预期的字符串。进一步的测试很有用。
以下字符串均从strtoul()
返回0
"0"
,"-0"
,"+0"
""
,"abc"
" 0"
"0xyz"
,"0 "
,"0.0"
strtoul()
具有多种检测模式。int base = 10;
char *endptr; // Store the location where conversion stopped
errno = 0;
unsigned long y = strtoul(s, &endptr, base);
if (s == endptr) puts("No conversion"); // "", "abc"
else if (errno == ERANGE) puts("Overflow");
else if (*endptr) puts("Extra text after the number"); // "0xyz", "0 ", "0.0"
else puts("Mostly successful");
尚未检测到什么。
strtoul()
有效地环绕了strtoul("-1", 0, 10) == ULONG_MAX)
。 在粗略的文档审阅中经常会漏掉此问题。 要检测负值,请执行以下操作:
// find sign
while (isspace((unsigned char) *s)) {
s++;
}
char sign = *s;
int base = 10;
char *endptr; // Store the location where conversion stopped
errno = 0;
unsigned long y = strtoul(s, &endptr, base);
if (s == endptr) puts("No conversiosn");
else if (errno == ERANGE) puts("Overflow");
else if (*endptr) puts("Extra text after the number");
else if (sign == '-' && y != 0) puts("Negative value");
else puts("Successful");
关于c - 如何使用 `strtoul`解析可能为零的字符串?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53764099/