2013-08-27 3 views
8

я написал следующую программу C:Объединить две символьные строки * в программе C

int main(int argc, char** argv) { 

    char* str1; 
    char* str2; 
    str1 = "sssss"; 
    str2 = "kkkk"; 
    printf("%s", strcat(str1, str2)); 

    return (EXIT_SUCCESS); 
} 

Я хочу, чтобы объединить две строки, но он не работает.

+4

Вы не в состоянии выделить буфер назначения достаточного размера, и пытаетесь написать немодифицируемую память. –

+4

Когда вы говорите «это не работает?», Что вы имеете в виду? Что это печать вместо того, что она должна? Даже если это довольно очевидно, вы также должны сказать, что, по вашему мнению, оно должно печатать, чтобы было ясно. – qaphla

+0

см. Этот вопрос [Использование strcat in C] (http://stackoverflow.com/questions/419604/using-strcat-in-c) – lsalamon

ответ

15

Как это работает заключается в следующем:

  1. Malloc памяти достаточно большой, чтобы держать копии str1 и str2
  2. Тогда он копирует str1 в str3
  3. Затем он добавляет str2 на конец str3
  4. Когда вы используете str3 вы обычно бесплатно это free (str3);

Вот вам пример игры. Это очень просто и не имеет жестко закодированных длин. Вы можете попробовать его здесь: http://ideone.com/d3g1xs

this post См информации о размере полукокса

#include <stdio.h> 
#include <memory.h> 

int main(int argc, char** argv) { 

     char* str1; 
     char* str2; 
     str1 = "sssss"; 
     str2 = "kkkk"; 
     char * str3 = (char *) malloc(1 + strlen(str1)+ strlen(str2)); 
     strcpy(str3, str1); 
     strcat(str3, str2); 
     printf("%s", str3); 

     return 0; 
} 
+0

В чем разница 'str3 =" sssss "и' strcpy (str3, str1) '? – BeCurious

+0

Строка str3 должна указывать на память, достаточно большую, чтобы удерживать строку. Вот почему я сделал это в строке выше. – dcaswell

+0

Но после этого кода 'char * str3 = (char *) malloc (1 + sizeof (char *) * (strlen (str1) + strlen (str2)));' Почему бы не использовать 'str3 =" sssss "' но использовать 'strcpy (str3, str1)' вместо? :) – BeCurious

3

strcat concats str2 на str1

Вы получаете ошибки во время выполнения, поскольку str1 не должным образом выделяется для конкатенации

+1

На самом деле 'strcat' возвращает конкатенированную строку. –

1

strcat(str1, str2) присоединяет str2 после str1. Для str2 требуется, чтобы у str1 было достаточно места для удержания str2. В вашем коде str1 и str2 являются строковыми константами, поэтому они не должны работать. Вы можете попробовать этот способ:

char str1[1024]; 
char *str2 = "kkkk"; 
strcpy(str1, "ssssss"); 
strcat(str1, str2); 
printf("%s", str1); 
1

strcat попытки добавить второй параметр к первому. Это не сработает, поскольку вы назначаете константные строки неявного размера.

Если все, что вам нужно сделать, это напечатать две строки из

printf("%s%s",str1,str2); 

сделать бы.

Вы могли бы сделать что-то вроде

char *str1 = calloc(sizeof("SSSS")+sizeof("KKKK")+1,sizeof *str1); 
strcpy(str1,"SSSS"); 
strcat(str1,str2); 

создать каскадную строку; однако настоятельно рекомендуем использовать strncat/strncpy. И внимательно прочитайте страницы руководства для вышесказанного. (о, и не забывайте free str1 в конце).

+0

В чем разница 'str1 =" ssss "и' strcpy (str1, "ssss") '? – BeCurious

2

При использовании строковых литералов, таких как "this is a string" и в вашем случае "sssss" и "kkkk", компилятор помещает их в постоянное запоминающее устройство. Однако strcat пытается записать второй аргумент после первого. Вы можете решить эту проблему, создав достаточный размерный буфер назначения и напишите на это.

char destination[10]; // 5 times s, 4 times k, one zero-terminator 
char* str1; 
char* str2; 
str1 = "sssss"; 
str2 = "kkkk"; 
strcpy(destination, str1); 
printf("%s",strcat(destination,str2)); 

Обратите внимание, что в последних компиляторах вы обычно получаете предупреждение о том, что для литья строковых литералов используются неконстантные указатели символов.

+0

спасибо за ваш идеальный ответ +1024! – BeCurious

11

Here является рабочим раствором:

#include <stdio.h> 
#include <string.h> 

int main(int argc, char** argv) 
{ 
     char str1[16]; 
     char str2[16]; 
     strcpy(str1, "sssss"); 
     strcpy(str2, "kkkk"); 
     strcat(str1, str2); 
     printf("%s", str1); 
     return 0; 
} 

Выход:

ssssskkkk 

Вы должны выделить память для ваших строк. В приведенном выше коде я объявляю str1 и str2 как массивы символов, содержащие 16 символов. Я использовал strcpy для копирования символов строковых литералов в них и strcat для добавления символов str2 в конец str1.Вот как эти символьные массивы выглядеть во время выполнения программы:

After declaration (both are empty): 
str1: [][][][][][][][][][][][][][][][][][][][] 
str2: [][][][][][][][][][][][][][][][][][][][] 

After calling strcpy (\0 is the string terminator zero byte): 
str1: [s][s][s][s][s][\0][][][][][][][][][][][][][][] 
str2: [k][k][k][k][\0][][][][][][][][][][][][][][][] 

After calling strcat: 
str1: [s][s][s][s][s][k][k][k][k][\0][][][][][][][][][][] 
str2: [k][k][k][k][\0][][][][][][][][][][][][][][][] 
+0

Это работает, спасибо за ваш ответ! – BeCurious

+0

A + для усилий и upvote! – amrith

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