Присвоение строк к массивам символов

Устранена аналогичная проблема в IBM RAD 7.5, выбрав:

  1. Свойства проектов
  2. Границы проекта
  3. Флажок JSTL
64
задан Ree 23 February 2009 в 22:54
поделиться

6 ответов

При инициализации массива C позволяет Вам заполнять его значениями. Так

char s[100] = "abcd";

в основном то же как [1 113]

int s[3] = { 1, 2, 3 };

, но оно не позволяет Вам делать уроки, так как s массив и не свободный указатель. Значение [1 114]

s = "abcd" 

должно присвоить значение указателя abcd к s, но Вы не можете измениться s с тех пор, ничто не будет указывать на массив.
Это может и действительно работать, если s char* - указатель, который может указать на что-либо.

, Если Вы хотите скопировать строку простое использование strcpy .

53
ответ дан Charles Moonen 7 November 2019 в 12:11
поделиться

Нет такой вещи как "строка" в C. В C строки являются одномерным массивом char, завершенный нулевым символом \0. Так как Вы не можете присвоить массивы в C, Вы не можете присвоить строки также. Литерал "привет" является синтаксическим сахаром для const char x[] = {'h','e','l','l','o','\0'};

, корректный путь был бы:

char s[100];
strncpy(s, "hello", 100);

или еще лучше:

#define STRMAX 100
char    s[STRMAX];
size_t  len;
len = strncpy(s, "hello", STRMAX);
49
ответ дан H.S. 7 November 2019 в 12:11
поделиться

Инициализация и присвоение являются двумя отличными операциями, которые, оказывается, используют тот же оператор (" = ") здесь.

12
ответ дан Sparr 7 November 2019 в 12:11
поделиться

Обратите внимание, что можно все еще сделать:

s[0] = 'h';
s[1] = 'e';
s[2] = 'l';
s[3] = 'l';
s[4] = 'o';
s[5] = '\0';
0
ответ дан aib 7 November 2019 в 12:11
поделиться

Чтобы подробно остановиться ответ Sparr

, Инициализация и присвоение являются двумя отличными операциями, которые, оказывается, используют тот же оператор (" = ") здесь.

Думают о нем как это:

Предполагают, что существует 2 функции, вызванные InitializeObject, и AssignObject. Когда компилятор видит thing = value, он смотрит на контекст и называет один InitializeObject при создании нового thing. Если Вы не, это вместо этого звонит AssignObject.

Обычно это прекрасно, поскольку InitializeObject и AssignObject обычно ведут себя тот же путь. Кроме тех случаев, когда, имея дело с массивами символов (и несколько других пограничных случаев), в этом случае они ведут себя по-другому. Почему делают это? Хорошо это - целое другое сообщение, включающее стек по сравнению с "кучей" и т. д. и т. п.

пз: Как в стороне, думая это таким образом также поможет Вам понять конструкторов копии и другие такие вещи, если Вы когда-нибудь будете рисковать в C++

2
ответ дан Community 7 November 2019 в 12:11
поделиться
1    char s[100];
2    s = "hello";

В примере Вы, если, s на самом деле инициализируется в строке 1, не строке 2. Даже при том, что Вы не присваивали ему значение явно в этой точке, компилятор сделал. В строке 2, Вы выполняете операцию присвоения, и Вы не можете присвоить один массив символов к другому массиву символов как это. Необходимо будет использовать strcpy () или некоторый цикл для присвоения каждого элемента массива.

3
ответ дан Matt Davis 7 November 2019 в 12:11
поделиться
Другие вопросы по тегам:

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