2015-10-16 2 views
0

Я пытался реализовать strcat(), поэтому я придумал этот код. Но, я не знаю, что в этом плохого? Это дает мне ошибку сегментации.Что не так с моей операцией сцепления?

Я думал, что это может быть беспорядок распределения памяти? Это оно? Как я могу исправить это, не используя malloc()?

#include <stdio.h> 

char *strcat(char *s,char *d){ 

while(*s++ != '\0') ; 
while(*s++ = *d++) ; 

*s = '\0'; 

return s; 
} 

int main(){ 

char s[20]= "source"; 
char d[20]= "dest"; 

printf("%s\n",strcat(s,d)); 

return 0; 
} 

Я должен Concat d опережая s.

+0

так что я должен использовать таНос? –

+1

Нет, достаточно определить 's', чтобы он удерживал обе строки плюс нулевой ограничитель:' char s [11] = "source" ', например. –

+0

Также вы путаете источник и назначение: вы добавляете пункт назначения в источник. – 4LegsDrivenCat

ответ

1

я установил его

#include <stdio.h> 
#define SIZE 20 

char *strocat(char *s,char *d){ 

char *temp = s; 

while(*s++ != '\0'); 
*--s; 
while(*s++ = *d++); 

*s = '\0'; 

return temp; 
} 

int main(){ 

char s[SIZE] = "source"; 
char d[SIZE] = "dest"; 

printf("%s\n",strocat(s,d)); 

return 0; 
} 
2
  1. Струны в памяти только для чтения
  2. Строки s не будет достаточно

долго Чтобы исправить:

... 
    #define S_STR "source" 

    char *d= "dest"; 
    char *s= S_STR; 
    s = malloc(strlen(s) + strlen(d) + 1); 
    strcpy(s, S_STR); 
    printf("%s\n",strcat(s,d)); 
    free(s); 
    return 0; 
} 
+0

Что делать, если я передаю массив символов? –

+0

Конечно, вы можете это сделать. –

+0

Да - только что заметил, что сам –

1

эля, d строковых констант! Вы никогда не должны делать такие вещи. имеют большой массив, такой как char s [100], копировать его, а затем использовать вашу конкатенацию. Помните, что у вас должно быть место для размещения контента d!

0

Строки s и d, которые вы указали, являются постоянными строковыми литералами, их нельзя изменить. вы должны объявить два массива символов и убедиться, что тот, который вы копируете, достаточно велик, чтобы удерживать другой.

#include <stdio.h> 

char *strcat(char *s,char *d) 
{ 
    //Get length of s string 
    size_t len = strlen(s); 

    //declare new pointer and assign it the value of s 
    char *ptr = s; 

    //move the pointer to the end of the string 
    ptr += len; 

    //copy contentes of d string to s string 
    while(*d != '\0') 
    { 
     *ptr++ = *d++; 
    } 

    *ptr = '\0'; 

    //return s 
    return s; 
} 

int main() 
{ 
    //make sure s array length is big enough to accomodate d string 
    char s[50] = "source"; 

    char d[] = "dest"; 

    printf("%s\n",strcat(s,d)); 

    return 0; 
} 
+0

Это код, а не ответ. Его можно улучшить, обратившись к вопросам в OP – trentcl

+0

. Кодовые комментарии ясны, я думаю. –

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