У меня есть функция, которой нужно передать строку с двумя числами (в виде регулярного выражения: /-?[0-9]+ -?[0-9]+/
) и вернуть второе.
Я решил, что программа должна выполнить проверку ошибок. Во-первых, он должен проверить, действительно ли строка имеет желаемую форму; во-вторых, он должен гарантировать, что первые числа (те, которые не возвращены) являются последовательными.
Я давно программирую, и это не сложная задача. (Это немного усложняется из-за того, что числа не должны вписываться в машинное слово.) Но мой вопрос о том, как я должен сделать это, а не о том, как я может . Все решения, которые я придумала, несколько уродливы.
- Я мог бы использовать глобальную переменную, чтобы сохранить значения и сравнить их (или просто оставить значение там, если оно
NULL
); это похоже на неправильную вещь.
- Я мог бы передать одно или оба возвращаемого значения и первого / последнего номера последней / текущей строки по ссылке и изменить их
- Я мог бы использовать возвращаемое значение, чтобы получить логическое значение, потому что была / не была ошибка
Так что любые мысли, касающиеся правильного способа справиться с проверкой ошибок такого рода в Си, приветствуются.
Это связано с гораздо более теоретическим вопросом, который я задавал по теории . Для справки, вот функция:
char*
scanInput(char* line)
{
int start = 0;
while (line[start] == ' ' || line[start] == '\t')
start++;
if (line[start] == '#')
return NULL; // Comment
if (line[start] == '-')
start++;
while (line[start] >= '0' && line[start] <= '9')
start++;
while (line[start] == ' ' || line[start] == '\t')
start++;
int end = start;
if (line[end] == '-')
end++;
while (line[end] >= '0' && line[end] <= '9')
end++;
if (start == end)
return NULL; // Blank line, or no numbers found
line[end] = '\0';
return line + start;
}
и это называется так:
while(fgets(line, MAX_LINELEN, f) != NULL) {
if (strlen(line) > MAX_LINELEN - 5)
throw_error(talker, "Maximum line length exceeded; file probably not valid");
char* kept = scanInput(line);
if (kept == NULL)
continue;
BIGNUM value = strtobignum(kept);
if (++i > MAX_VECLEN) {
warning("only %d terms used; file has unread terms", MAX_VECLEN);
break;
}
// values are used here
}