2

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

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

谢谢!

4

1 回答 1

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 */;

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 */;
于 2013-09-23T23:09:32.580 回答