Ответ 1
Обычно, как писал другой плакат:
char s[6] = {'s', 't', 'r', 'i', 'n', 'g'};
или если ваша текущая C-кодировка - ASCII, которая обычно верна (не так много EBCDIC сегодня)
char s[6] = {115, 116, 114, 105, 110, 107};
Существует также сильно игнорируемый способ, который работает только в C (не С++)
char s[6] = "string";
Если размер массива слишком мал, чтобы удерживать конечный 0 (но достаточно большой, чтобы удерживать все остальные символы константной строки), конечный ноль не будет скопирован, но он все еще действителен C (но недействителен С++).
Очевидно, вы также можете сделать это во время выполнения:
char s[6];
s[0] = 's';
s[1] = 't';
s[2] = 'r';
s[3] = 'i';
s[4] = 'n';
s[5] = 'g';
или (то же замечание в кодировке ASCII, как указано выше)
char s[6];
s[0] = 115;
s[1] = 116;
s[2] = 114;
s[3] = 105;
s[4] = 110;
s[5] = 103;
Или используя memcopy (или memmove или bcopy, но в этом случае нет никакой пользы для этого).
memcpy(c, "string", 6);
или strncpy
strncpy(c, "string", 6);
Что следует понимать, так это то, что в C нет строки типа C (в С++ есть объекты строк, но это совсем другая история). Так называемые строки - это просто char массивы. И даже имя char вводит в заблуждение, это не char, а просто своего рода числовой тип. Вероятно, мы могли бы назвать его байтом, но в прежние времена существовало странное аппаратное обеспечение, использующее 9-битные регистры или такие, а байты - 8 бит.
Поскольку char будет очень часто использоваться для хранения символьного кода, дизайнеры C подумали о более простом способе, чем хранить номер в char. Вы можете поместить письмо между простыми кавычками, и компилятор поймет, что он должен хранить этот код символа в char.
Что я имею в виду (например), что вам не нужно делать
char c = '\0';
Чтобы сохранить код 0 в char, просто выполните:
char c = 0;
Поскольку нам очень часто приходится работать с кучей символов переменной длины, дизайнеры C также выбрали соглашение для "строк". Просто поместите код 0, где текст должен заканчиваться. Кстати, есть имя для такого рода строкового представления "строка с нулевым завершением", и если вы видите две буквы sz в начале имени переменной, это обычно означает, что это содержимое является строкой с нулевым завершением.
"C sz strings" не является типом вообще, просто массив символов, как обычно, как, скажем, массив int, но функции манипуляции с строкой (strcmp, strcpy, strcat, printf и многие другие) понимают и используйте соглашение о завершении 0. Это также означает, что если у вас есть массив char, который не завершен нулем, вы не должны вызывать какие-либо из этих функций, поскольку он, вероятно, сделает что-то неправильно (или вы должны быть осторожны и использовать функции с буквой от их имени как strncpy).
Самая большая проблема с этим соглашением заключается в том, что существует много случаев, когда он неэффективен. Один типичный пример: вы хотите поместить что-то в конец строки с завершающим 0. Если вы сохранили размер, вы можете просто прыгать в конце строки, используя соглашение sz, вы должны проверить его char на char. Другие проблемы возникают при работе с кодированным юникодом или таковым. Но в то время, когда C был создан, это соглашение было очень простым и отлично справилось с работой.
В настоящее время буквы между двойными кавычками, такими как "строка", не являются обычными массивами char, как в прошлом, но const char *
. Это означает, что указатель указывает на константу, которая не должна быть изменена (если вы хотите ее изменить, вы должны сначала ее скопировать), и это хорошо, потому что она помогает обнаруживать многие ошибки программирования во время компиляции.