strtol 没有按预期工作
strtol not working as expected
我无法使用 strtol 将字符串转换为长字符串。在字符串 returns 0 中的数字之前有前导 "."
。
没有预期的 "."
strtol returns 3456
。
#include <stdio.h>
#include <stdlib.h>
int main ()
{
char str[20] = " . 3456\r\n";
long ret = strtol(str, NULL, 10);
printf("ret is %ld\n",ret);
return(0);
}
strto*
库函数只会跳过前导空格。如果你想跳过其他文本,你需要手工完成。 ctype.h
中的 isxxx
函数可以帮助解决这个问题:
#include <ctype.h>
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main (int argc, char **argv)
{
char *p, *endp;
unsigned long ret;
int fail = 1;
if (argc != 2) {
fprintf(stderr, "usage: %s number-to-parse\n", argv[0]);
return 2;
}
p = argv[1];
while (*p && !isdigit(*p)) p++;
errno = 0;
ret = strtoul(p, &endp, 10);
if (endp == p)
printf("'%s': no number found\n", str);
else if (*endp && !isspace(*endp))
printf("'%s': junk on line after number\n", str);
else if (errno)
printf("'%s': %s\n", str, strerror(errno));
else {
printf("'%s': parsed as %lu\n", str, ret);
fail = 0;
}
return fail;
}
我无法使用 strtol 将字符串转换为长字符串。在字符串 returns 0 中的数字之前有前导 "."
。
没有预期的 "."
strtol returns 3456
。
#include <stdio.h>
#include <stdlib.h>
int main ()
{
char str[20] = " . 3456\r\n";
long ret = strtol(str, NULL, 10);
printf("ret is %ld\n",ret);
return(0);
}
strto*
库函数只会跳过前导空格。如果你想跳过其他文本,你需要手工完成。 ctype.h
中的 isxxx
函数可以帮助解决这个问题:
#include <ctype.h>
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main (int argc, char **argv)
{
char *p, *endp;
unsigned long ret;
int fail = 1;
if (argc != 2) {
fprintf(stderr, "usage: %s number-to-parse\n", argv[0]);
return 2;
}
p = argv[1];
while (*p && !isdigit(*p)) p++;
errno = 0;
ret = strtoul(p, &endp, 10);
if (endp == p)
printf("'%s': no number found\n", str);
else if (*endp && !isspace(*endp))
printf("'%s': junk on line after number\n", str);
else if (errno)
printf("'%s': %s\n", str, strerror(errno));
else {
printf("'%s': parsed as %lu\n", str, ret);
fail = 0;
}
return fail;
}