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;
}