#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. следующий пробел не считывался. Спасибо!