Как вернуть ошибку, если файл не содержит определенных типов данных

#c #scanf

#c #scanf

Вопрос:

Я читаю текстовый файл, который содержит следующее в определенном порядке: номер с заглавной буквы с заглавной буквы (например, C4S). Я могу успешно сделать это с помощью sscanf, где ‘line’ — это массив символов, найденный из fgets.

Псевдокод:

 sscanf(line, "%c %d %c", amp;firstLetter, amp;number, amp;secondLetter)
  

Я хочу вернуть ошибку, если файл не содержит ‘номер с заглавной буквы заглавной буквы’ в таком порядке. Как я мог это сделать?

Комментарии:

1. Просто протестируйте firstLetter и другие переменные с помощью таких функций, как isdigit() и isalpha() . Но прежде всего проверьте scanf возвращаемое значение.

2. Ваш цитируемый формат и ваш код не согласуются. Есть ли пробелы в файле или нет? Было бы очень полезно показать форматированный пример ввода со строками, которые должны и не должны вызывать запрошенную ошибку.

3. Входным сигналом было бы C4 S, и если бы я должен был напечатать f(«%c %d %c, firstLetter, number, secondLetter); на выходе было бы C4 S.

4. Что касается комментария Роберто, да, это хорошая идея, но разве вы не можете получить переменную (например, firstLetter) только из определения того, какой тип она имеет в sscanf? В этом случае у нас могло бы быть три буквы, которые затем вызвали бы воспроизведение sscanf, поскольку он ожидает цифру во второй записи.

5. Нет, C4ST не будет работать, должны быть три значения, переданные из файла, поскольку он используется в дальнейшем в программе

Ответ №1:

Я бы рекомендовал не использовать sscanf практически в любой ситуации, когда вы еще не абсолютно уверены, что предоставленные входные данные будут соответствовать вашей строке формата. Итак, что вы можете сделать вместо этого, сначала выполните такую проверку и только затем, если она пройдет успешно, вызовите sscanf :

 if (strlen(line) == 3 amp;amp; isupper(line[0]) amp;amp; isdigit(line[1]) amp;amp; isupper(line[2])) {
   sscanf(line, "%c%c", amp;c1, amp;d, amp;c2);
} else {
   puts("line not valid");
   // error handling goes here
}
  

Я немного изменил имена некоторых переменных и строку формата, но вы можете легко это адаптировать.

Комментарии:

1. Сработало бы это, если бы между тремя переменными было пространство? Файл будет гибким, поэтому он может быть: C4S, C 4S, C4 S и т.д. и т.п.

2. Нет, в таком случае я бы сначала убрал все пробелы из «строки». Есть несколько других ответов StackOverflow, которые объясняют, как это сделать.