Вам необходимо установить целевой массив, который как минимум на один элемент больше, чем количество символов в конечной строке:
char str[3]; // 2 characters plus string terminator
str[0] = a;
str[1] = b;
str[2] = 0; // you'll sometimes see that written as str[2] = '\0'
Ни операторы +
, ни =
не определены для строкиоперации.Вам придется использовать библиотечные функции str*
(strcat
, strcpy
, strlen
и т. Д.) Для строковых операций.
РЕДАКТИРОВАТЬ
В C строка представляет собой последовательность символьных значений, оканчивающихся 0-значным байтом - строка "hello"
являетсяпредставлены последовательностью символов {'h', 'e', 'l', 'l', 'o', 0}
(иногда вы увидите '\0'
вместо простого 0
).Строки хранятся в массивах char
.Строковые литералы, такие как "hello"
, хранятся в массивах char
, так что они видны в течение всего жизненного цикла программы, но не предназначены для изменения - попытка обновить содержимое строкового литерала приводит к неопределенному поведению (код можетсбой, операция может просто не завершиться успешно, код может вести себя как ожидалось и т. д.).
За исключением случаев, когда он является операндом операторов sizeof
или унарных &
, или является строковым литералом, используемым для инициализации массива символов в объявлении, выражением типа "N-элемент T
"будет преобразован (" распад ") в выражение типа" указатель на T
", а значением выражения будет адрес первого элемента.Поэтому, когда мы имеем дело со строками, мы обычно имеем дело с выражениями типа char *
- однако это не означает, что char *
всегда ссылается на строку .Он может указывать на один символ, который не является частью строки, или он может указывать на последовательность символов, которые не имеют терминатора 0.
Итак, давайте начнем со строкового литерала, например "hello"
.Он будет храниться «где-то» как массив:
+---+---+---+---+---+---+
|'h'|'e'|'l'|'l'|'o'| 0 |
+---+---+---+---+---+---+
Когда вы пишете что-то вроде
char *str = "hello";
адрес первого элемента массива, которыйсохраняет "hello"
записывается в указатель переменная str
:
+---+ +---+---+---+---+---+---+
str: | | ---> |'h'|'e'|'l'|'l'|'o'| 0 |
+---+ +---+---+---+---+---+---+
Хотя вы можете читать каждый str[i]
, вы не должны писать в него (технически, поведение не определено).С другой стороны, когда вы пишете что-то вроде:
char str[] = "hello";
str
создается как массив , а содержимое строкового литерала копируетсядля массива:
+---+---+---+---+---+---+
|'h'|'e'|'l'|'l'|'o'| 0 |
+---+---+---+---+---+---+
+---+---+---+---+---+---+
str: |'h'|'e'|'l'|'l'|'o'| 0 |
+---+---+---+---+---+---+
Размер массива зависит от размера инициализатора, поэтому он будет иметь ширину 6 элементов (+1 для ограничителя строки).Если массив будет содержать результат конкатенации или операции печати, то он должен быть достаточно большим, чтобы вместить результирующую строку плюс терминатор 0, и массивы C не будут автоматически увеличиваться при добавлении к ним содержимого.Итак, если вы хотите объединить две 3-символьные строки вместе, тогда целевой массив должен иметь размер не менее 7 элементов:
char result[7];
char *foo = "foo";
char *bar = "bar";
strcpy( result, foo ); // copies contents of foo to result
strcat( result, bar ); // appends the contents of bar to result