strncpy символьная строка проблема при добавлении длины - PullRequest
1 голос
/ 22 марта 2012

У меня проблема со сравнением двух одинаковых строк символов:

char string[50];

strncpy(string, "StringToCompare", 49);

if( !strcmp("StringToCompare", string) )
//do stuff
else
//the code runs into here even tho both strings are the same...this is what the problem is.

Если я использую:

strcpy(string, "StringToCompare");

вместо:

strncpy(string, "StringToCompare", 49);

это решает проблему, но я бы скорее добавил длину строки, чем получал сам.

Что здесь не так? Как мне решить эту проблему?

Ответы [ 5 ]

2 голосов
/ 22 марта 2012

Вы забыли поставить завершающий символ NUL на string, так что, возможно, strcmp запустится до конца.Используйте эту строку кода:

string[49] = '\0';

, чтобы решить вашу проблему.

0 голосов
/ 22 марта 2012

Параметр подсчета байтов в strncpy сообщает функции, сколько байт нужно скопировать, а не длину буфера символов.

Итак, в вашем случае вы просите скопировать 49 байтов из вашей константной строки в буфер, что я не считаю вашим намерением!

Однако это не объясняет, почему вы получаете аномальный результат. Какой компилятор вы используете? Когда я запускаю этот код под VS2005, я получаю правильное поведение.

Обратите внимание, что strncpy() устарел в пользу strncpy_s, что требует, чтобы ему была передана длина буфера:

strncpy_s (string,sizeof(string),"StringToCompare",49)
0 голосов
/ 22 марта 2012

Множество очевидных догадок в других ответах, но быстрое предложение.

Прежде всего, написанный код должен работать (и фактически работает в Visual Studio 2010). Ключ кроется в деталях 'strncpy' - это не подразумевает добавление завершающего символа null, если длина источника не меньше длины назначения (что в данном случае и есть). С другой стороны, strcpy включает терминатор null во всех случаях, что говорит о том, что ваш компилятор неправильно обрабатывает функцию strncpy.

Итак, если это не работает на вашем компиляторе, вам, вероятно, следует инициализировать ваш временный буфер следующим образом:

char string[50] = {0}; // initializes all the characters to 0

// below should be 50, as that is the number of 
// characters available in the string (not 49).
strncpy(string, "StringToCompare", 50);

Однако, я подозреваю, что это, скорее всего, просто пример, и в реальном мире ваша исходная строка имеет длину 49 (опять же, вы должны передать от 50 до strncpy в этом случае) символов или более, в этом случае терминатор NULL равен НЕ копируется во временную строку.

Я бы повторил предложения в комментариях, чтобы использовать std::string, если доступно. Он позаботится обо всем этом для вас, чтобы вы могли сосредоточиться на своей реализации, а не на этих банальных деталях.

0 голосов
/ 22 марта 2012

strcopy и strncpy: в этой ситуации они ведут себя одинаково !!

Таким образом, вы не сказали нам правду или всю картину (например: длина строки не менее 49 символов)

0 голосов
/ 22 марта 2012

Вам необходимо установить нулевой терминатор вручную при использовании strncpy:

strncpy(string, "StringToCompare", 48);
string[49] = 0;
...