Предполагая, что
- под «строкой» вы подразумеваете строку с нулевым символом в конце, как обычно подразумевается в C;
- вы еще не выделили память в
data
;
- вы уже знаете, что s <= x </li>
Сначала вам нужно выделить память в data
. Не забывайте комнату для байта 0
в конце строки.
data = malloc(s+1);
if (data == NULL) {
... /*out-of-memory handler*/
}
Если malloc
успешно, вы можете скопировать байты.
EDIT
Лучшая функция для работы, как указано в caf, - это strncat
. (Полностью переносимая, будучи частью C89.) Она добавляется к строке назначения, поэтому организуйте пункт назначения заранее быть пустой строкой:
*(char*)data = 0;
strncat(data, buf, s);
Другие низшие возможности, сохраненные здесь, чтобы служить примерами связанных функций:
Если у вас есть strlcpy
(который не является стандартным C, но распространен в современных системах Unix; существуют общедоступные реализации, распространяющиеся вокруг):
strlcpy(data, buf, s+1);
Если вы знаете, что в исходной строке есть хотя бы s
символов, вы можете использовать memcpy
:
memcpy(data, buf, s);
((char *) data) [s + 1] = 0;
В противном случае вы можете сначала вычислить длину исходной строки:
size_t bytes_to_copy = strlen(buf);
if (bytes_to_copy > s) bytes_to_copy = s;
memcpy(data, buf, bytes_to_copy);
((char*)data)[s+1] = 0;
Или вы можете использовать strncpy
, хотя это неэффективно, если фактическая длина исходной строки намного меньше, чем s
:
strncpy(data, buf, s);
((char*)data)[s+1] = 0;