Strncpy () ошибка вывода длины строки - PullRequest
1 голос
/ 21 ноября 2011

У меня проблема с strncpy() копированием дополнительного символа на нужную мне длину. Мне нужно скопировать 10 самых значимых битов из одной строки в другую (обе в формате char*).

Размер большей переменной не имеет значения, и меньшая влияет только на результат, когда он значительно меньше нужного мне значения (я не знаю, почему это тоже).

Значение n в моем strncpy() может быть причиной проблемы, но я понятия не имею, почему она действует так, как есть. Если я не ошибаюсь, n, длина строки назначения, должна быть на 1 больше, чем данные, чтобы учесть нулевой символ в конце.

Моя строка не ведет себя таким образом вообще. Устанавливая n в 11, я получаю следующий вывод:

00000111101100100100001110100000

00000111101

Я бы предположил, что он будет копировать только 10 символов с последним нулем. Увеличение n дает те же результаты.

Уменьшение n до 10 раскрывает суть проблемы:

00000111101100100100001110100000

0000011110@

Я не знаю, почему он это сделал, но он продолжает делать это с уменьшением n, пока n не станет намного меньше (около 8).

Это соответствующие строки моего кода:

char line[11], hexAddr[8], binAddr[33], lv1Index[11];
    ...
strncpy(lv1Index, binAddr, 10);

, где lv1Index был не тронут до этого, и binAddr отображается (в данном выводе) непосредственно заранее.

Добавляемый символ всегда @, поэтому я не верю, что это мусор из lv1Index предварительной инициализации.

1 Ответ

3 голосов
/ 21 ноября 2011

С одна ссылка C ++ :

Если конец исходной строки C (который обозначается нулевым символом) найден до того, как будет скопировано num символов,пункт назначения дополняется нулями до тех пор, пока в него не будет записано всего num символов.

Никакой нулевой символ не добавляется неявно в конец пункта назначения, поэтому пункт назначения будет заканчиваться нулем только при длине буквы Cстрока в источнике меньше чем num.

Другая документация ( MSDN , man page ) содержит аналогичную информацию.

Это означает, что выдолжен поставить нулевой терминатор на себя:

 lv1Index[10] = '\0';
...