Присвоение значения массиву char
Я не получаю ошибки при вводе
char a[10] = "Hi";
Но когда я меняю его на следующее, я получаю сообщение об ошибке: Array type char is not assignable.
char a[10];
a = "Hi";
Почему тип массива char не присваивается? Это потому, что язык написан специально, или я не хватает точки?
Ответы
Ответ 1
Способ С++ для этого, как я уже отмечал выше, будет использовать std::string
вместо char[]
. Это даст вам поведение назначения, которое вы ожидаете.
Тем не менее, причина, по которой вы получаете только ошибку во втором случае, состоит в том, что =
в этих двух строках означает разные вещи:
char a[10] = "Hi";
a = "Hi";
Первая - это инициализация, вторая - назначение.
Первая строка выделяет достаточно места в стеке для хранения 10 символов и инициализирует первые три из этих символов как "H", "i" и "\ 0". С этого момента все a
действительно ссылаются на позицию массива в стеке. Поскольку массив - это просто место в стеке, a
никогда не разрешается изменять. Если вы хотите, чтобы другое место в стеке имело другое значение, вам нужна другая переменная.
Вторая (недействительная) строка, с другой стороны, пытается изменить a
, чтобы ссылаться на (технически другое) заклинание "Hi"
. Это не допускается по причинам, указанным выше. Когда у вас есть инициализированный массив, единственное, что вы можете с ним сделать, это считывать значения из него и записывать в него значения. Вы не можете изменить его местоположение или размер. Это то, что задание будет пытаться сделать в этом случае.
Ответ 2
Массив не является изменяемым lvalue
использовать
char a[10];
strcpy(a, "Hi");
Ответ 3
Язык не позволяет назначать строковые литералы массивам символов. Вместо этого следует использовать strcpy()
:
strcpy(a, "Hi");
Ответ 4
a - указатель на массив, а не сам массив. Его нельзя переназначить.
Вы отметили С++ BTW. В этом случае лучше использовать std::string. Вероятно, это больше того, чего вы ожидаете.
Ответ 5
Простой,
char a[10] = "Hi";
- небольшая "дополнительная функция", так как это невозможно сделать во время выполнения.
Но это причина для стандартных библиотек C/С++.
#include <string.h>
// ...
strcpy(a,"Test"); // STR-ing C-o-PY.
Это происходит из стандартной библиотеки C. Если вы используете С++, вы должны использовать std::string, если вы действительно не хотите сосать всю возможную производительность с вашего ПК назначения.
Ответ 6
это потому, что инициализация не является назначением. первое, что работает, это инициализация, а вторая, которая не работает, как и ожидалось, - это назначение. вы просто не можете присваивать значения массивам, которые вы должны использовать sth, как strcpy
или memcpy
. или вы можете в качестве альтернативы использовать std::copy
из <algorithm>
Ответ 7
Это так просто, (=) имеют два разных среднего назначения и инициализации. Вы также можете написать свой код
#include <iostream>
using namespace std;
int main ()
{
char message[3] = {'H', 'i', '\0'};
cout << message<< endl;
return 0;
}
в этом коде вам не нужно писать сложный код или функцию и даже не нужно string.h