C: использование strtol endptr никогда не NULL, не может проверить, является ли значение только целым числом?

Так вот в чем проблема. У меня есть набор данных, который должен быть:

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

Спасибо!

2

Решение

Если предположить, что предыдущий код уже разбил строку на отдельные числа, то проверка, которую вы хотите

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

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]