2013-08-08 4 views
1

У меня есть две строки char str1[41] e char str2[41]. Если я использую функцию strcat для их конкатенации, я получаю уникальную строку без пробела, вместо этого у меня будет пространство между ними.добавить место в strcat

это может быть способом:

strcat(strcat(str1, " "),str2) 

ли существует другой способ?

ответ

5

sprintf(destination, "%s %s", str1, str2);

Вы должны предоставить место назначения. Вы можете использовать str1 в качестве пункта назначения, и это может работать правильно, но обратите внимание, как вы в настоящее время делаете что-то может привести к переполнению буфера str1.

asprintf() будет выделять для вас буфер, с правильной длиной (прочитанной: безопасной), но вы должны помнить free() этот буфер, когда вы закончите с ним.

+0

'asprintf()' является большим, но быть в курсе, что это не POSIX стандарт и, таким образом, не везде –

+1

Http: //www.mibsoftware .com/libmibx/parse/asprintf.c, по-видимому, является свободно лицензированной версией в исходной форме. Я сам не использовал эту реализацию. – mah

+0

спасибо за эту ссылку! –

0

Если strcat является обязательным требованием, я считаю, что наиболее эффективным способом было бы:

size_t length = strlen(str1); 
str1[length] = ' '; // overwrite null termination 
str1[length+1] = '\0'; // add a new null termination 
strcat(str1, str2); 

И, конечно же, быть в курсе переполнения буфера.

+2

еще более эффективен (если 'strcat()' не требуется): 'strcpy (str1 + length + 1, str2)' вместо 'str1 [length + 1] = '\ 0'' и' strcat (str1, str2); ' –

+0

@IngoLeonhardt Да, добавлено разъяснение. Если strcat не требуется, то 'memcpy (str1 + strlen (str1), str2, strlen (str2) +1);' будет намного более эффективным. – Lundin

+1

@ Lundin Я не думаю, что memcpy будет более эффективным из-за необходимости определять strlen (str2).Это заставит вас пройти эту строку дважды, в то время как простой strcat проходит через нее только один раз, останавливаясь в NULL. – mah

-1

Добавить пробелы в конце str1 перед тем конкатенации с str2, или добавить пробелы в начале str2, а затем объединить две строки ...

+0

Первым делом именно то, что делается 'strcat (strcat (str1," "), str2) ' –

0

Для поддержания эффективности и уважения ограниченный размер массива str1,

size_t Len1 = strlen(str1); 
size_t Len2 = strlen(str2); 
if ((Len1 + 1 + Len2) >= sizeof(str1)) { 
    ; // handle error 
} 
str1[Len1] = ' '; 
memcpy(&Str1[Len1+1], str2, Len2 + 1); 

ИЛИ

.

, как это определено в C11 K.3.7.1.3, если таковые имеются, используйте strcpy_s()

size_t Len = strlen(str1); 
strcpy_s(&str1[Len], Len - sizeof(str1), " ") || strcpy_s(&str1[Len+1], Len - (sizeof(str1) + 1), str2); 

Предпосылка: strcat() не требуется.

0

Вы можете попробовать это. Надеюсь, это поможет вам.

strcat(string1, " "); 
strcat(string1, string2); 
0

Размещение фигурные скобки вокруг пространства решает проблему: strcat(str, {' '})

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