Как читать в строках, содержащих только буквы алфавита, с помощью fscanf?

#c #scanf

#c #scanf

Вопрос:

Я изо всех сил пытался разобраться с форматированием fscanf. Я просто хочу прочитать в файле слова, разделенные пробелами. И я хочу отбросить любые строки, содержащие неалфавитные символы.

 char temp_text[100];
while(fscanf(fcorpus, "1[a-zA-Z]s", temp_text) == 1) {
  printf("%sn", temp_text);
}
  

Я пробовал приведенный выше код как с ‘s’, так и без него. Я прочитал в другом потоке stackoverflow, что s при подобном использовании будет интерпретироваться как литерал ‘s’, а не как строка. В любом случае — когда я включаю s и когда я не включаю s — я могу получить только первое слово из файла, который я читаю, для распечатки.

Ответ №1:

%[ Спецификатор сканирования не пропускает начальные пробелы. Либо добавьте пробел перед ним, либо в конце вместо вашего s . Также у вас есть 100 и 101 в обратном порядке и, следовательно, серьезная ошибка переполнения буфера.

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

1. Спасибо за оба исправления! Я изменил параметр width и добавил пробел после ‘]’ вместо s, и теперь все работает гладко 🙂 В качестве более общего вопроса, лучше ли использовать спецификаторы типа только тогда, когда они служат именно той цели, которую вы хотите? Вы когда-нибудь использовали спецификаторы типа в сочетании с модификаторами?

2. Я обнаружил, что редко использую scanf семейство функций. Каждый раз, когда я пытаюсь их использовать, я сталкиваюсь с небольшим отклонением от поведения, которого я пытаюсь добиться, которое либо сложно, либо невозможно обойти. Обычно fgets или даже fgetc в конечном итоге становится проще в использовании.

Ответ №2:

s не требуется.

Вот несколько вещей, которые нужно попробовать:

Распечатайте возвращаемое значение из fscanf и убедитесь, что оно равно 1.

Убедитесь, что fscanf использует пробелы, используя fgetc для получения следующего символа и распечатки его.

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

1. Ах. Вы помогли мне определить, к чему клонил R. следующий пробел не считывался. Спасибо!