Цепочка 2 струны в C - PullRequest
0 голосов
/ 30 апреля 2018

Я хочу связать 2 строки в C. Используемая мной функция называется concat() Сначала я определил что-то вроде этого, и это сработало

char* concat(const char *s1, const char *s2)
{
    char* result = malloc (15);  
    int lengh1 =  simple_strlen (s1);
    int lengh2 =  simple_strlen (s2);
    int i=0,j;
    for ( i = 0 ;i < lengh1;i++){
        if (i!=lengh1-1)
            result[i]=s1[i];
        else{
            result[i]=s1[i];
            for ( j=i+1 ; j< lengh1+lengh2;j++){
                    result[j] = s2[j-i-1];
            }
        }
    }

return result;
} 

Но затем меня попросили сделать это без malloc(), поэтому я определил что-то вроде этого:

char* concat( char *result, const char *s2)
{  
    int lengh1 =  simple_strlen (result);
    int lengh2 =  simple_strlen (s2);
    int i=0;
    for ( i = 0 ;i < lengh2;i++){   
            result[i+lengh1]=s2[i];
    } 
    return result;
}

но есть ошибка сегментации

example:



   int main(int argc , char* argv[], char* envp[])
   {
          printf(concat( "hello", "world"));/*output expected "helloworld"*/

        return 0;

   }   

Ответы [ 2 ]

0 голосов
/ 01 мая 2018

В вашем коде несколько проблем:

  • в версии malloc пространство, выделенное для строки назначения, жестко закодировано в 15 вместо того, чтобы вычислять его как lengh1 + lengh2 + 1, достаточно места для обеих строк и завершающего нулевого байта.
  • вы не устанавливаете нулевой терминатор в конце строки назначения в обеих версиях.
  • в вашей версии без malloc, вы должны предоставить достаточно большой массив в качестве места назначения для concat(). Строковая константа не может быть изменена. Простое решение состоит в том, чтобы передать целевой буфер и исходные строки как отдельные аргументы.

Вот модифицированные версии:

char *concat(const char *s1, const char *s2) {
    int length1 = simple_strlen(s1);
    int length2 = simple_strlen(s2);
    char *result = malloc(length1 + length2 + 1);
    int i, j;
    for (i = 0; i < length1; i++) {
        result[i] = s1[i];
    }
    for (i = 0; i < length2; i++) {
        result[length1 + i] = s2[1];
    }
    result[length1 + length2] = '\0';
    return result;
}

Без malloc():

#include <string.h>

char *concat(char *dest, const char *s1, const char *s2) {
    char *p = dest;
    while (*s1)
        *p++ = *s1++;
    while (*s2)
        *p++ = *s2++;
    *p = '\0';
    return dest;
}

int main() {
    char buf[100];
    /* output expected "helloworld" */
    printf("%s\n", concat(buf, "hello", "world"));
    return 0;
}
0 голосов
/ 30 апреля 2018

Как упоминалось предыдущими комментаторами, вам нужно выделить память где-то для хранения объединенной строки. Если вам не разрешено выделять в куче через malloc, вы можете сделать что-то вроде этого:

#include "stdafx.h"
# include <string.h>
char* concat( char * result , const char *s1, const char *s2)
{
    int lengh1 = strlen(s1);
    int lengh2 = strlen(s2);
    int i = 0;
    for (i = 0; i < lengh1; i++) {
        result[i] = s1[i];
    }
    for (i = 0; i < lengh2; i++) {
        result[i+ lengh1] = s2[i];
    }
    return result;
}

int main()
{

    char mybuffer[100];
    memset(mybuffer, 0, sizeof(mybuffer));
    printf(concat( mybuffer,"hello", "world"));/*output expected "helloworld"*/
    return 0;
}
...