C:使用strtol endptr永远不会为NULL,不能检查值是否只是整数?

Geo*_*lov 2 c c++ strtok strtol

所以这就是问题所在.我有一组应该是的数据:

int int int int ....

但是,我希望如果我有1asdas 2,我希望能够抓住"asdas"部分.但是,此时,如果我只有1 2,那么endptr不是NULL,所以我无法检查该值是否仅为数字或数字和字母.这是我的代码:

            else if(token != NULL && token2 != NULL && token3 == NULL){
                    //we POSSIBLY encountered row and column values for the matrix
                    //convert the two numbers to longs base 10 number
                    int row = strtol(token, &result, 10);
                    int col = strtol(token2, &result2, 10);
                    printf("Result is %s and result2 is %s\n", result, result2);
                    //check to see if both numbers are valid
                    //this will be true if there were only 2 digits on the line
                    if(!result && !result2){
                            //SUCCESSFULL parsing of row and column
                            printf("SUCCESSFUL PARSING\n");
                    }
            }
Run Code Online (Sandbox Code Playgroud)

谢谢!

zwo*_*wol 5

假设先前的代码已经将该行拆分为单个数字,那么您需要的检查就是

errno = 0;
long row = strtol(token, &endtoken, 10);
if (*endtoken != '\0')
    fprintf(stderr, "invalid number '%s' (syntax error)\n", token);
else if (endtoken == token)
    fprintf(stderr, "invalid number '' (empty string)\n");
else if (errno)
    fprintf(stderr, "invalid number '%s' (%s)\n", token, strerror(errno));
else
    /* number is valid, proceed */;
Run Code Online (Sandbox Code Playgroud)

strtol永远不会设置endtoken为空指针; 它会将其设置为指向不是数字第一个字符.如果该字符是NUL 字符串终止符(注意略有不同的拼写),则整个字符串是有效数字,除非 endtoken == token,这意味着您给出strtol了空字符串,这可能不算作有效数字.该errno操作是必要赶这是语法正确的,但范围之外的数字long.

您可以通过直接从行缓冲区中提取数字来简化代码,而不是先将其拆分:假设在任何给定的行上应该只有两个数字,

char *p = linebuf;
char *endp;
errno = 0;
long row = strtol(p, &endp, 10);
if (endp == p || !isspace(p) || errno)
  /* error, abandon parsing */;
p = endp;
long col = strtol(p, &endp, 10);
if (endp == p || p != '\0' || errno)
  /* error, abandon parsing */;
Run Code Online (Sandbox Code Playgroud)