Чтение строки с помощью scanf



Я немного запутался в чем-то. У меня сложилось впечатление, что правильный способ чтения строки C с scanf() пошел по линии



(не обращайте внимания на возможное переполнение буфера, это просто пример)



char string[256];
scanf( "%s" , string );


однако, следующее, кажется, тоже работает,



scanf( "%s" , &string );


это просто мой компилятор (gcc), чистая удача, или что-то еще?

621   3  

3 ответов:

массив "распадается" на указатель на его первый элемент, так что scanf("%s", string) эквивалентно scanf("%s", &string[0]). С другой стороны, scanf("%s", &string) передает указатель-к-char[256], но он указывает на то же место.

затем scanf, при обработке хвоста его списка аргументов, будет пытаться вытащить char *. Это правильно, когда вы прошли в string или &string[0], но когда вы прошли в &string вы зависите от чего-то, что языковой стандарт не гарантирует, а именно что указатели &string и &string[0] -- указатели на объекты разных типов и размеров, которые начинаются в одном месте и представлены таким же образом.

Я не думаю, что когда-либо сталкивался с системой, на которой это не работает, и на практике вы, вероятно, в безопасности. Тем не менее, это неправильно, и он может потерпеть неудачу на некоторых платформах. (Гипотетический пример: реализация "отладки", которая включает информацию о типе С каждым указателем. Я думаю C реализация на символике "Lisp Machines" сделала что-то вроде этого.)

в случае строки (символьного массива) сама переменная указывает на первый элемент рассматриваемого массива. Таким образом, нет необходимости использовать оператор ‘&’ для передачи адреса.

  • ‘&’ используется для получения адреса переменной. C не имеет a тип строка, строка-это просто массив символов и массив переменная хранит адрес первого расположения индекса.

  • по умолчанию сама переменная указывает на основание адрес и поэтому для доступа к базовому адресу строки нет необходимости добавление дополнительного‘&'

почему " & " не используется для строк в функции scanf ()?

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

char str[]  
  1. массив значений типа char, с собственным адресом в памяти
  2. массив значений типа char, с собственным адресом в памяти столько последовательных адресов, сколько элементов в массиве
  3. включая нулевой символ завершения ''&str,&str[0] и str, все три представляют собой то же самое расположение в памяти, которое является адресом первого элемента массива str

    char * strPtr = &str[0]; //объявление и инициализация

кроме того, вы можете разделить это на два:

char *strPtr; strPtr = &str[0];
  1. strPtr указатель на char
  2. strPtr указывает на массив str
  3. strPtr - это переменная со своим собственным адресом в
  4. strPtr - это переменная, которая хранит значение адреса &str[0]
  5. strPtr собственный адрес в памяти отличается от адреса памяти, который он хранит (адрес массива в памяти a.k.a &str[0])
  6. &strPtr представляет собой адрес самого strPtr

я думаю, что можно объявить указатель на указатель, как:

char **vPtr = &strPtr;  

объявляет и инициализирует с адресом указателя strPtr

в качестве альтернативы вы можете разделить в два:

char **vPtr;
*vPtr = &strPtr
  1. *vPtr указывает на указатель strPtr
  2. *vPtr - это переменная со своим собственным адресом в
  3. *vPtr - это переменная, которая хранит значение address & strPtr
  4. последнее замечание: вы не можете сделать str++,str адрес const, но вы можете сделать strPtr++

Comments

    Ничего не найдено.