Вопрос по c++ – Назначение строки символов в массив символов

19

Я хочу знать, почему первые утверждения работают, а почему нет второго в C ++

char a[10]="iqbal";  // it works

a="iqbal"; // does not work 
Это C или C ++? Пожалуйста уточни. user195488
это получается как прямая оценка интерфейса SO. Пожалуйста, поиск перед публикацией: возможно, дубликатAssigning strings to arrays of characters Jens Gustedt

Ваш Ответ

6   ответов
0

пытаться:

char a[10]="iqbal";
char *my_a = a;

и работать с my_a.

3

Вторая строка - оператор выражения с оператором присваивания.

Вы не можете назначать массивы в C.

Но вы можете инициализировать массив с элементами строкового литерала.

5

если вы инициализируете его следующим образом. В любом случае, вы никогда не сможете назначить строку символов a = & quot; iqbal & quot; в с. Для этого вы должны использовать strncpy или memcpy. В противном случае вы попытаетесь перезаписать указатель на строку, а это не то, что вам нужно.

Таким образом, правильный код будет выглядеть примерно так:

char a[10];
strncpy(a, "iqbal", sizeof(a) - 1);
a[sizeof(a) - 1] = 0;

-1 - зарезервировать байт для конечного нуля. Обратите внимание, вам придется самостоятельно проверить, завершена ли строка нулем или нет. Плохой апи. Существует вызов strlcpy (), который делает это за вас, но он не включен в glibc.

22

And an array ( base address of the array ) cant be a modifiable lvalue, то есть он не может появляться в левой части оператора присваивания. Массивы распадаются на указатели только при определенных обстоятельствах. Прочитай этоТАК сообщение чтобы узнать, когда массивы распадаются на указатели. Вот еще одинхорошая статья который объясняет различия между массивами и указателями

Также читайте о lvalues и rvaluesВот так что вы получите представление о вещах, которые не могут появиться на LHS=

char a[10]="iqbal";  // it works

В этом случае внутренне происходит

a[0] = 'i';
a[1] = 'q'; 
 .
 .
a[5] = '\0';

Так что все хорошо, какarray[i] является изменяемым значением lvalue.

a="iqbal"; // does not work

Внутренне это примерно эквивалентно

0x60000(Address of a, but is a simple number here ) = Address of "iqbal"

Это неправильно, так как мы не можем присвоить что-то номер.

На самом деле,aError: User Rate Limit Exceeded
Error: User Rate Limit ExceededaError: User Rate Limit ExceededaError: User Rate Limit ExceededaError: User Rate Limit Exceeded
aError: User Rate Limit ExceededmodifiableError: User Rate Limit ExceededhenceError: User Rate Limit Exceeded=Error: User Rate Limit Exceededthis
1

Потому что это разные заявления, почти совершенно не связанные. Не смущайтесь тем фактом, что они оба используют= условное обозначение. В одном случае это представляет инициализацию объекта. В другом случае оператор присваивания.

Ваша первая строка допустима, потому что допустимо инициализировать агрегаты, включая массивы символов.

Ваша вторая строка недопустима, потому что недопустимо присваивать массиву.

Поскольку это C ++, могу ли я предложить вам избегать использования голых массивов? Для символьных строк используйтеstd::string, Для других массивов используйтеstd::vector, Если вы делаете, ваш пример становится:

std::string a = "iqbal";  // it works
a="iqbal"; // so does this
0

char a [10] = "iqbal" Вы инициализируете элементы массива символовa с персонажами. Мы можем сделать то же самое сint тип (обратите внимание, чтоchar Тип получает немного другое лечение): int a [10] = {1,2, ...};

Но написание следующего после декларации части будет недействительным какa будет рассматриваться как указатель. Так что писать что-то вроде а = {1,2, ...}; или = "iqbal" не будет никакого смысла!

Похожие вопросы