strncpy (), чтобы получить конец строки - PullRequest
1 голос
/ 11 декабря 2010

Я использую строки в стиле C для проекта и немного запутываю себя. Я проверяю строки, чтобы увидеть, к чему они добавляются (zone_, player_ и т. Д.), А затем получаю оставшуюся часть строки.

else if(strncmp(info, "zone_", 5) == 0)
{
    int len = strlen(info);
    char *zoneName = new char[len];
    strncpy(zoneName, &info[5], len-5);

    Msg("Zone Selected: %s\n", zoneName);
    delete zoneName;
}

Когда я распечатываю переменную zoneName, она верна, за исключением того, что за ней следует кучка бреда. Что я делаю неправильно? (Я понимаю, что все остальное в массиве char пустое, но я не знаю лучшего способа сделать это)

Ответы [ 4 ]

2 голосов
/ 11 декабря 2010

См. strncpy описание:

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

1 голос
/ 11 декабря 2010

Вы должны помнить, что строки в стиле C заканчиваются символом NUL.Вы выделили достаточно места в zoneName, но вам нужен только len-5 плюс один:

char *zoneName = new char[len - 5 + 1];

Затем вы можете использовать strcpy() для копирования конца строки:

strcpy(zoneName, &info[5]);

Вам не нужно указывать длину, поскольку исходная строка завершена NUL.

0 голосов
/ 11 декабря 2010

Строки в стиле C должны заканчиваться байтом с нулевым значением.Вы должны изменить свой код следующим образом:

char *zoneName = new char[len-5+1];
strncpy(zoneName, &info[5], len-5);

/* correct string ending */
zoneName[len]=0;

/* Now, it's safe to print */
Msg("Zone Selected: %s\n", zoneName);
0 голосов
/ 11 декабря 2010
Строки

C заканчиваются нулем - поэтому они занимают len байтов (точнее, символов), плюс еще одну со значением ноль, известным как «нулевой терминатор».Вам необходимо выделить еще один символ и либо скопировать еще один из источника (так как он должен заканчиваться нулем), либо просто установить последний символ назначения на 0.

int len = strlen(info);
char *zoneName = new char[len - 5 + 1];
strncpy(zoneName, &info[5], len - 5 + 1);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...