использование% [^ \ n] - PullRequest
3 голосов
/ 29 апреля 2010
A[50][5000];
for(i=0;i<50;++i)
scanf("%[\n]",A[i]);

%[^\n]  
 usage and meaning of it

and can i use that struct like

       %[\t]
       %[\a]

Ответы [ 3 ]

2 голосов
/ 29 апреля 2010
Спецификатор преобразования

scanf() * "%[" запускает так называемый «набор сканирования». Он имеет некоторые сходства с конструкцией регулярных выражений, которая выглядит одинаково (но она все же сильно отличается). Вот что говорит стандарт:

Соответствует непустой последовательности символов из набора ожидаемых символов (набор сканирования).

...

Спецификатор преобразования включает все последующие символы в строке формата, вплоть до соответствующей правой скобки (]). Символы в скобках (список сканирования) составляют набор сканирования, если только символ после левой скобки не является окружностью (^), и в этом случае набор содержит все символы, которые не отображаются в списке сканирования между кольцом и правой скобкой. Если спецификатор преобразования начинается с [] или [^], правый символ скобки находится в списке сканирования, а следующий следующий правый символ скобки - это совпадающая правая скобка, которая завершает спецификацию; в противном случае первый следующий символ правой скобки - это тот, который завершает спецификацию. Если символ - находится в списке сканирования и не является ни первым, ни вторым, где первый символ является ^, ни последним символом, поведение определяется реализацией.

Таким образом, scanf() преобразование "%[\n]" будет соответствовать символу новой строки, тогда как "%[^\n]" будет соответствовать всем символам до новой строки.

Вот что П. Дж. Плаугер говорит о наборах сканирования в «Стандартной библиотеке C»:

Набор сканирования ведет себя так же, как спецификатор преобразования s. Он хранит до w символов (по умолчанию - остальная часть ввода) в массиве символов, на который указывает ptr. Он всегда хранит нулевой символ после любого ввода. не пропускает начальные пробелы. Он также позволяет указать, какие символы следует рассматривать как часть поля. Вы можете указать все совпадающие символы, как в %[0123456789abcdefABCDEF], что соответствует произвольной последовательности шестнадцатеричных цифр. Или вы можете указать все символы, которые не совпадают, как в %[^0123456789], который соответствует любым символам, кроме цифр.

Если вы хотите включить правую скобку (]) в указанный вами набор символов, напишите ее сразу после открытия [ (или [^), как в %[][], который сканирует квадратные скобки , Вы не можете включить нулевой символ в набор символов, который вы укажете. Некоторые реализации могут позволять вам указывать диапазон символов, используя знак минус (-). Например, список шестнадцатеричных цифр можно записать как %[0-9abcdefABCDEF] или даже, в некоторых случаях, как %[0-9a-fA-F]. Обратите внимание, однако, что такое использование не является универсальным. Избегайте этого в программе, которую вы хотите сохранить максимально переносимой.

1 голос
/ 29 апреля 2010

Да, это довольно очень похоже на набор в регулярном выражении - вы можете указать набор символов, которые будут приняты, или набор символов для завершения сканирования, так что "% [^ \r \ n \ t] "будет читать, пока не встретится пробел, возврат каретки, новая строка или табуляция.Как и в случае с RE, ведущий «^» означает «не» - вы можете опустить его, чтобы указать символы, которые будут приняты, вместо тех, которые завершат преобразование.В большинстве компиляторов (хотя это технически не требуется) вы можете указать диапазоны, такие как «% [az]», чтобы указать любую строчную букву (в этом случае, когда «-» не является первым или последним символом,поведение определяется реализацией).

Хотя это преобразование не используется широко (или даже не известно), оно почти всегда является частью C и поддерживается в C89 / 90.

0 голосов
/ 29 апреля 2010

копирует строку до новой строки из стандартного ввода в элемент i элемента A. Как написано, это действует почти как gets ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...