Если первая часть строки всегда является числом, посмотрите на функцию strtoul
. Со страницы man
:
strtoul - преобразовать строку в длинное целое число без знака
БИБЛИОТЕКА
Стандартная библиотека C (libc, -lc)
СИНТАКСИС
#include <stdlib.h>
unsigned long strtoul(const char *restrict str, char **restrict endptr, int base);
ОПИСАНИЕ * * 1016
Функция strtoul () преобразует строку в str в unsigned long
значение. Конверсия осуществляется в соответствии с заданной базой,
который должен быть между 2 и 36 включительно, или быть специальным значением 0.
Строка может начинаться с произвольного количества пробелов (как определено isspace(3)
), за которым следует один необязательный знак +
или -
. Если
base
- ноль или 16, строка может включать префикс 0x
, а
номер будет читаться в базе 16; в противном случае нулевое основание принимается за 10
(десятичный), если следующий символ не является 0
, в этом случае он принимается как
8 (восьмеричное).
Остальная часть строки преобразуется в длинное значение без знака в
очевидным образом, остановка в конце строки или в первом символе, который не дает действительной цифры в заданной базе. (В базах
выше 10 буква A
в верхнем или нижнем регистре обозначает 10, B
представляет 11, и так далее, с Z
, представляющим 35.)
Если endptr
не NULL
, strtoul()
сохраняет адрес первого недействительного
символ в *endptr
. Однако, если цифр не было вообще, strtoul()
сохраняет исходное значение str
в *endptr
. (Таким образом, если *str
не является \0
но **endptr
равно \0
при возврате, вся строка была действительной.)
ВОЗВРАЩАЕМЫЕ ЗНАЧЕНИЯ
Функция strtoul () возвращает
либо результат конвертации, либо, если был ведущий минус
знак, отрицание результата преобразования, если оригинал
(неотрицательное) значение будет переполнено; в последнем случае strtoul()
возвращает
ULONG_MAX
. Во всех случаях errno
установите на ERANGE
. Если преобразование не может быть выполнено, возвращается 0 и
глобальная переменная errno установлена в EINVAL
.
Ключ здесь - параметр endptr
. Он устанавливает указатель на то место, где вам нужно продолжить анализ. Если endptr == str
, то вы знаете, что строка не начиналась с цифры.
Мне нравится семейство функций strto___
намного больше, чем функции ato__
, потому что вы можете установить base
(включая контекстную "базу 0") и потому, что endptr
говорит мне, где продолжить с. (А для встроенных приложений strto___
занимает гораздо меньше места, чем __scanf
функций.)
РЕДАКТИРОВАТЬ: Извините, что пропустил ваш комментарий. Чтобы использовать endptr
, напишите код как:
char* restOfLine = NULL;
unsigned long result = strtoul(lineBuffer, 10, &restOfLine);
if(restOfLine == NULL || restOfLine == lineBuffer)
{
/* Handle error. */
}
else
{
// Use result, and do further parsing starting at restOfLine.
}
Как правило, предложение «error error» возвращает или разбивает или генерирует исключение, или делает что-то еще, чтобы вырваться из дальнейшей обработки, поэтому вам не понадобится явное предложение else
.