Использование амперсанда в scanf () - PullRequest
3 голосов
/ 13 марта 2010

Когда я компилирую scanf("%s", &var);, gcc отправляет обратно предупреждение:

warning: format ‘%s’ expects type ‘char *’, but argument 2 has type ‘char (*)[20]’

однако, когда я компилирую scanf("%s", var);, предупреждение не применяется. Обе части кода работают, и книга, которую я читаю, специально говорит об использовании амперсанда, но даже в некоторых примерах это не так.

У меня вопрос, должен ли я продолжать использовать амперсанд, даже если книга не указывает?

Ответы [ 4 ]

4 голосов
/ 13 марта 2010

Из того, что вы опубликовали var - массив символов. В этом случае вам не нужен амперсанд, просто имя var будет оцениваться как (char *) по мере необходимости.

Детали:

scanf нужен указатель на переменную, которая будет хранить ввод. В случае строки вам нужен указатель на массив символов в памяти, достаточно большой для хранения любой строки для чтения. Когда вы объявляете что-то вроде char var[100], вы создаете пространство для 100 char с с помощью var [0 ] относится к первому символу, а var [99] относится к сотому символу. Имя массива само по себе оценивается точно так же, как &var[0], который является указателем на первый символ последовательности, именно то, что нужно для scanf. Поэтому все, что вам нужно сделать, это scanf("%s", var);, но помните, что scanf не налагает ограничений на размер входных строк, поэтому, если пользователь введет строку длиной 101, у вас будет переполнение буфера, что приведет к ошибкам или, еще хуже проблемы с безопасностью. Лучший выбор, как правило, fgets, который допускает ограничения размера для входных строк.

1 голос
/ 27 января 2011

Удалите & из scanf("%s", &var);, чтобы получилось scanf("%s", var);.

1 голос
/ 13 марта 2010

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

Так что я просто укажу вам хороший ресурс , чтобы узнать об указателях и ссылках, которые лежат в основе вашей проблемы. http://www.cplusplus.com/doc/tutorial/pointers/

0 голосов
/ 13 марта 2010

Когда вы используете такой массив:

char name[20];

Вы должны учитывать, что область памяти, состоящая из 20 символов, связана с ней. Чтобы получить адрес начала этой области памяти, вы должны использовать имя массива, а для получения адреса одного символа этого массива вы должны использовать синтаксис, подобный следующему: & name [i]. > Вы используете scanf для чтения строки, которая является массивом char в C. scanf требует адрес области памяти, связанной с типом переменной для чтения. В этом случае вы читаете массив, поэтому вам нужно только использовать имя. Если вы хотите прочитать одну переменную, а не массив, вы должны использовать амперсанд. Например:

char myChar;
scanf("%c", &myChar);

Надеюсь, это может быть полезно.

...