Страницы

Поиск по вопросам

четверг, 5 марта 2020 г.

Объясните спецификатор

#c


Использовал в scanf спецификатор " %[^\r\n]" для того, чтобы мог вводить название
из нескольких слов,отделенных пробелами.(посоветовали так же на форуме это спецификатор
использовать), но как его объяснить.Почему в квадратных скобках?
Что означает "^" крышечка? 
Коротко говоря подробно написать саму работу данного спецификатора.
    


Ответы

Ответ 1



Читайте документацию по scanf, там все подробно написано. Спецификатор формата вида %[что-то] означает "читать все символы, пока они принадлежат набору, указанному в квадратных скобках". Спецификатор формата вида %[^что-то] означает "читать все символы, пока они НЕ принадлежат набору, указанному в квадратных скобках" (т.е "читать все символы, пока не наткнешься на один из указанных в квадратных скобках"). В вашем случае " %[^\r\n]" означает: пропустить ведущие пробелы и затем читать все подряд, пока не наткнешься на '\r' или '\n'. Вообще-то, если речь не идет о каких-то тонкостях, связанных с обработкой символа '\r', scanf с форматом " %[^\r\n]" означает просто "пропустить ведущие пробелы и затем читать до конца строки", при этом оставляя символы конца строки непрочитанными. Это примерно то же самое, что и обычный fgets, с той только разницей, что fgets не пропускает ведущие пробелы и вычитывает из потока символы конца строки. Может быть вам лучше подойдет просто fgets и не надо городить огород с этим %[]? Также не ясно, зачем понадобилась отдельная обработка символа '\r'. Если речь идет о чтении текстового потока под Windows, то там никакого '\r' уже не будет. Все маркеры конца строки будут заменены на простое '\n' еще до того, как дело дойдет до scanf. Также имейте в виду, что scanf не умеет читать пустые строки. То есть если этот %[^\r\n] сразу же наткнется на '\r' или '\n', то scanf тут же завершится с ошибкой, не изменив значение принимающего буфера.

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

Отправить комментарий