Так вот в чем проблема. У меня есть набор данных, который должен быть:
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");
}
}
Спасибо!
Если предположить, что предыдущий код уже разбил строку на отдельные числа, то проверка, которую вы хотите
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 */;
Других решений пока нет …