Ваша функция может выглядеть следующим образом:
char* sum_str(char* s1, char* s2)
{
int lenS1 = strlen(s1);
int lenS2 = strlen(s2);
char* newString = malloc((lenS1 + lenS2 + 1) * sizeof(char));
int i = 0;
while(i < lenS1)
{
newString[i] = s1[i];
i++;
}
while(i < lenS2 + lenS1)
{
newString[i] = s2[i - lenS1];
i++;
}
newString[i] = '\0';
return newString;
}
Обратите внимание, что эта функция выделяет новую строку, что означает, что вы должны free
эти данные, когда вы закончите с этой строкой.Также обратите внимание, что завершающий символ ('\0'
) хранится в конце этого массива символов, так что printf
может правильно «напечатать» его.
Вот главное:
int main()
{
char *s1, *s2, *s3;
s1 = "Joe";
s2 = " Black";
s3 = sum_str(s1,s2);
printf("%s\n", s3);
free(s3);
return 0;
}
Вывод: Joe Black
Обратите внимание, что я объявил переменные s1
, s2
и s3
следующим образом: char *s1, *s2, *s3;
.Если я напишу это так: char *s1, s2, s3;
, тогда переменные s2
и s3
больше не являются массивами символов, а только символами.
Также обратите внимание, что эта программа:
char *s1 = "Joe";
s1[0] = 'X';
printf("%s\n", s1);
произойдет сбой, поскольку он пытается изменить константу строкового литерала "Joe"
.s1
является указателем на первый символ этого литерала в этом случае.
Но эта программа будет работать нормально, и ее вывод будет Xoe
:
char s1[] = "Joe";
s1[0] = 'X';
printf("%s\n", s1);
s1
являетсяМассив инициализируется строкой "Joe"
, поэтому его можно изменить.