2010-10-14 6 views
1

Я пишу программу C, которая принимает строки n и объединяет их с помощью strcat. Сначала я выделяю целевую строку в sizeof(char)* strlen каждой строки + 1 (для нулевого символа). Затем с помощью a для использования strncat для создания окончательной строки. В и, я добавляю нулевой символ.C строк конкатенации - странные символы

Все идет хорошо, но иногда в начале целевой строки есть некоторые странные символы (например, «?»). Это происходит, когда во время выполнения программы конечная строка короче, чем раньше (во время того же выполнения).

Есть что-то, что мне не хватает?

Это код:

size = 0; 
for(i = 0; i < n; i++) { 
    size += sizeof(char)*(strlen(strings[i])); 
} 

size++; 

target = malloc(size); 

if(!target) { /** Error handling... */ } 

for(i = 0; i < n; i++) { 
    target = strncat(target, strings[i], strlen(strings[i])); 
} 

target[size] = '\0'; 

Спасибо,

-Donovan

+4

Опубликовать реальный код. –

+0

как вы на самом деле помещаете первую строку в целевую строку? – SirDarius

+0

Извините. Теперь есть код. – Donovan

ответ

6

Вы должны сначала инициализировать целевую строку в пустую строку сразу после выделения ее.

target[0] = '\0'; 

На первом вызове strncat, то первая строка будет добавлена ​​к цели. Если ваша цель не инициализирована, она может быть не пустой, что приводит к появлению символов мусора.

(Другим решением является, чтобы скопировать первый из ваших строк с strncpy в мишень, а затем добавьте следующие строки к нему.)

+0

+1, я посмотрел на неправильный конец массива. – schot

2
target[size] = '\0'; 

Массив размера n имеет действительных индексов 0 к n - 1. Вы можете изменить, что: (.. Хотя это не вызывает вас начиная мусора символов Для этого, см Didier Trosset's answer)

target[size-1] = '\0'; 

еще несколько советов для вашего кода:

  • sizeof (char) == 1 по определению, поэтому он сохраняет, чтобы опустить.
  • Поскольку вы точно знаете строки, вы можете использовать здесь strcat. Это сэкономит вам n звонков на strlen.
  • Окончательный target[size-1] = '\0' на самом деле не нужен, потому что str(n)cat всегда null-завершает свою цель.
+0

Я выбрал ответ Дидье, но спасибо за ваш намек (+1)! – Donovan

1

Кстати, каждый звонок strncat() должен пересекать строку только для того, чтобы найти, где она будет вставлять. Это делает вашу функцию O (n). Это довольно просто сделать лучше, чем что (изменения в вашем коде жирным):

 
size = 0; 
for(i = 0; i < n; i++) { 
    size += strlen(strings[i]); 
} 

size++; 

target = malloc(size); 

if(!target) { /** Error handling... */ } 

char *current_ptr = target; 

for(i = 0; i < n; i++) { 
size_t len = strlen(strings[i]); 
    memcpy(current_ptr, strings[i], len); 
    current_ptr += len; 
} 

*current_ptr = 0; 
0

Также вам не нужно собирать возвращаемое значение strncat обратно в цель.

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