2013-10-12 4 views
0

Я пытаюсь разбить строку по две, чтобы перейти к двум детям. первая часть должна быть 12 '0' символов, а вторая должна быть 13 '1' символов. Когда я выполняю этот код, я не получаю ни одной из этих вещей. в частности, это выход. Родительские левые: 00000000000 Родитель право: 0000000000001 Я понятия не имею, почему, может кто-то может помочь?Malloc и strncpy

int bit_count(char *passed, int len){ 
int left = len/2; 
int right =(len/2)+(len % 2); 
char *lstring = malloc(sizeof(char)*(left+1)); 
char *rstring = malloc(sizeof(char)*(right+1)); 
strncpy(lstring, passed, sizeof(char)*12); 
strncpy(rstring, passed+left, sizeof(char)*13); 
printf("Parent Left: %s\n", lstring); 
printf("Parent Right: %s\n", rstring); 
+0

Зачем рассчитывать влево и вправо, если вы просто собираете хард-код 12 и 13 здесь. Это не имеет никакого смысла. – StoryTeller

+0

Право, я изменил его на это, чтобы попытаться понять, что происходит. в конечном итоге я останусь налево и вправо. – ReezaCoriza

+2

Вам не нужно умножать на 'sizeof (char)' - аргумент 'strncpy' - это количество символов для копирования, а не размер. – Barmar

ответ

1

Не используйте strncpy, если она не нужна, и если вы не знаете, что именно он делает.

В вашем случае это совершенно лишний, вы знаете размер массива, который вы хотите скопировать, во всяком случае. Поэтому используйте memcpy:

memcpy(lstring, passed, left); 
lstring[left] = '\0'; 
memcpy(rstring, passed+left, right); 
rstring[right] = '\0'; 
+0

«Не используйте' strncpy', если он вам не нужен, и если вы точно не знаете, что он делает ». То же самое можно сказать о * любой * функции. Но да, 'strncpy' особенно вводит в заблуждение. –

+0

Спасибо. Это сработало, и вы правы, я не понимаю strncpy. Возможно когда-нибудь. – ReezaCoriza

+0

Очень приятное объяснение функции '' strncpy() '(http://the-flat-trantor-society.blogspot.com/2012/03/no-strncpy-is-not-safer-strcpy.html) , –

2

Проблема заключается в том, что strncpy() не добавляет нуль-терминатор, если он останавливается из-за границы, а не доходя до конца исходной строки. Поэтому вам нужно добавить нулевой ограничитель.

int bit_count(char *passed, int len) { 
    int left = len/2; 
    int right = len - left; 
    char *lstring = malloc(left+1); 
    char *rstring = malloc(right+1); 
    strncpy(lstring, passed, left); 
    lstring[left] = '\0'; 
    strncpy(rstring, passed+left, right); 
    rstring[right] = '\0'; 
    printf("Parent Left: %s\nParent Right: %s\n", lstring, rstring); 
} 
0

Добавить NULL символ после каждого strncpy

lstring[left]='\0'; 


rstring[right]='\0'; 
+1

null знак. 'NULL' является константой * указателя null *. –

Смежные вопросы