1) Если в C вообще есть строки, они определяются как «произвольная непрерывная последовательность ненулевых байтов, оканчивающаяся нулевым байтом». Следовательно, если ваши двоичные данные гарантированно никогда не будут содержать байтов , значение которых равно нулю, вы можете безопасно обрабатывать их как строку C (используйте с ней функции str*
и т. Д.). Но если ваши двоичные данные могут иметь нулевые байты где-то посередине, вам нужно отслеживать длину отдельно и работать с ней вместо функций mem*
.
2) Вы используете strlen
, чтобы найти длину строки (без завершающего нулевого байта). Однако в стандартном C89 вы не можете использовать результат strlen
, чтобы установить размер переменной char[]
, потому что размер должен быть известен во время компиляции. Если вы используете расширения C99 или GNU, вы можете определить размер массива во время выполнения:
size_t n = strlen(s1);
char s2[n+1];
memcpy(s2, s1, n);
n+1
необходим, иначе у вас не будет места для завершающего NUL. Если вы не можете использовать ни C99, ни расширения GNU, единственный вариант - выделить место в куче:
size_t n = strlen(s1);
char *s2 = malloc(n+1);
memcpy(s2, s1, n);
или, с общим расширением библиотеки, просто
char *s2 = strdup(s1);
В любом случае, не забудьте free(s2)
позже. Кстати, это тот случай, когда было бы безопасно использовать strcpy
, потому что по построению вы знаете, что буфер назначения достаточно велик. Я использовал memcpy
, потому что он может быть немного более эффективным и означает, что читатели не увидят "strcpy" и не начнут беспокоиться.