2015-04-09 2 views
-3

Я пытаюсь объединить две строки, используя указатель на C, но он не работает на 100%. В конце строки вывода, многие неизвестные символы появляются ...concatinate two String Использование указателя в C

char* concat_string (char* s1, char* s2) { 
    char *s; 
    int k=0; 
    s=(char *)malloc((strlen(s1)+strlen(s2))*sizeof(char)); 
    while (*s1!='\0') { 
     *(s+k)=*s1; 
     k++; 
     s1++; 
    } 
    while (*s2!='\0') { 
     *(s+k)=*s2; 
     k++; 
     s2++; 
    } 
    return s; 
} 

int main() { 
    char *ch1, *ch2, *s; 
    char cch1[10], cch2[10]; 
    printf("ch1 ? "); 
    scanf("%s",cch1); 
    printf("ch2 ? "); 
    scanf("%s",cch2); 
    ch1=cch1; 
    ch2=cch2; 
    s=concat_string(ch1, ch2); 
    printf("\n%s + %s = ", ch1, ch2); 
    while (*s!='\0') { 
     printf("%c", *s); 
     s++; 
    } 
} 
+6

Этот код полностью не читается, я думаю, что даже компилятор не может его понять. –

ответ

3

Вы не включая пространство для терминатора каскадного результата. Это:

s=(char *)malloc((strlen(s1)+strlen(s2))*sizeof(char)); 

должно быть:

s = malloc(strlen(s1) + strlen(s2) + 1); 

Вы не копирование терминатор либо, что объясняет результат вы видите.

Кроме того, не следует использовать значение malloc() в C, и введите свои строки ввода const.

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

char * concat_string(const char *s1, const char *s2) 
{ 
    char *s = malloc(strlen(s1) + strlen(s2) + 1); 
    if(s != NULL) 
    { 
    char *p = s; 
    while((*p++ = *s1++) != '\0'); 
    --p; 
    while((*p++ = *s2++) != '\0'); 
    } 
    return s; 
} 

Это, конечно, все еще довольно скупо, но я бы утверждать, что это более читабельным, чем версии.

+0

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

+0

@iharob Вы знаете, что они говорят о практике. :) – unwind

0

printf ждем завершенных строк. В противном случае, он будет печатать все символы в памяти, пока он не достигнет одного. Ваша функция concat_string не помещает нулевой ограничитель в строку.

char* concat_string (char* s1, char* s2){char *s;int k=0; 
s=(char *)malloc((strlen(s1)+strlen(s2))*sizeof(char)); 
while(*s1!='\0'){*(s+k)=*s1;k++;s1++; } 
while(*s2!='\0'){*(s+k)=*s2;k++;s2++;} 
*(s+k) = 0; 
return s; 
} 

Кроме того, эта функция уже написана для вас, просто попробуйте использовать strcat.

+2

Вы не выделили достаточно места через 'malloc'. Таким образом, '* (s + k) = 0;' записывает недопустимую ячейку памяти. И не делайте результат 'malloc' –