мелочью, но строковые литералы имеют тип char*
(или const char*
в C++), а не unsigned char*
- это может быть то же самое в своей реализации, но они не» должно быть.
Кроме того, это не так:
unsigned char * string = "HELLO WORLD!!!" // length 14
Строка фактически занимает байт - есть дополнительный, скрытый '\0'
в конце концов, называется nul
байт, который знаменует собой конец строка. Эти nul-терминаторы очень важны, потому что, если их нет, тогда многие функции библиотеки C, которые манипулируют строками, будут продолжаться до тех пор, пока они не попадут в байт со значением, равным '\0'
, - и поэтому может закончиться чтением или попиранием бит памяти они не должны делать. Это называется переполнением буфера и является классической ошибкой (и эксплуатационной проблемой безопасности) в программах на языке C.
В вашем примере вы не включили этот nul-терминатор в свою скопированную строку, поэтому printf()
просто продолжает идти, пока не найдет один, следовательно, тарабарщина, которую вы видите. В общем, неплохо было бы использовать функции библиотеки C для управления строками C, если это возможно, поскольку они осторожны, чтобы добавить терминатор для вас. В этом случае strncpy
от string.h
делает именно то, что вам нужно.
Значит, вы хотите 'strncpy'? –