Похоже, вы думаете, fscanf()
использует регулярные выражения.
Это не так. C не имеет регулярных выражений.
Я думаю вы ищете:
fscanf(puzzle_file, "%1i%1i%1i%*s", &row, &column, &value)
При этом 1-й, 2-й и 3-й символы будут получены как целые числа, тогда оставшиеся данные в строке не будут сохранены в переменной.
Я никогда не видел [^/n]
в scanf, и, видимо, это не проблема.
Я подозреваю, что проблема в вашей in_range()
функции. Что это?
Редактировать, так как добавлен дополнительный код:
Ваш fscanf
был в порядке. Ваш in_range()
нет. isdigit()
сообщает вам, является ли символ цифрой.
Перечитывая ваши требования, я предлагаю это для вашей логики чтения строк:
char buffer[5];
int row, column, value;
int count = 1;
while(fgets(buffer, 5, puzzleFile) != NULL)
{
if ( (buffer[3] == '\n')
&& (sscanf(buffer, "%1i%1i%1i%*[^\n]", &row, &column, &value) == 3))
{
puzzle[row][column] = value;
}
else
{
printf("Illegal format in configuration file at line %i\n", count);
exit(1);
}
count++;
}
Это гарантирует, что каждая строка состоит из 3 символов с новой строкой. %1i
в sscanf гарантирует, что каждый символ является цифрой в диапазоне 0-9, если все три соответствуют и были присвоены вашим переменным (он возвращает количество назначений).