Объединение двух массивов с использованием цикла while - PullRequest
0 голосов
/ 16 июня 2019

Нет проблем с кодом.У меня есть сомнения, можем ли мы объединить два массива или нет.Мы узнали, что не можем увеличить размер массива после его объявления.Но следующий код, кажется, делает это.Можем ли мы добавить элементы в статически созданные массивы, используя нижнюю часть?

while (S1 [i] = S2 [j]) {i ++;j ++;}

#include<stdio.h>

char* strcatt(char[], char[]);

int main(void) {
    char S1[] = "University of Colombo";
    char S2[] = "Sri Lanka";
    printf("%s\n", strcatt(S1, S2));
return 0;
}

char* strcatt(char S1[], char S2[]) {
    int i = 0, j = 0;
    while(S1[i]) {
        i++;
    }
    S1[i++] = ' ';
    while(S1[i] = S2[j]) {
        i++;
        j++;
    }
return (S1);
}

Я получаю этот вывод: - Университет Коломбо Шри-Ланка

Ответы [ 2 ]

1 голос
/ 16 июня 2019

Сама функция верна, за исключением того, что она должна быть обновлена ​​следующим образом

char * strcatt( char s1[], const char s2[] ) 
{
    size_t i = 0, j = 0;

    while ( s1[i] ) i++;

    s1[i++] = ' ';

    while ( s1[i] = s2[j] ) 
    {
        i++;
        j++;
    }

    return s1;
}

Это тип int переменных i и j следует изменить на тип size_t потому что размер массива может быть больше максимального положительного значения объекта типа int.

И второй параметр должен быть квалифицирован как const, так как он не изменяется функцией,Иначе, по крайней мере, вы не сможете вызвать функцию для массива константных символов, переданного функции в качестве второго аргумента, даже если она не изменена в функции.

Но, тем не менее, программа имеет неопределенное поведение, поскольку символВ массиве S1 нет места для размещения строки, хранящейся во втором массиве S2.

Программа будет действительной, если в первом массиве символов будет хотя бы 32 или более элементов

char S1[32] = "University of Colombo";

То есть, если размер массива будет равен или больше sizeof( "University of Colombo" ) + sizeof( "Sri Lanka" )

Учтите, что неопределенное поведение означает все, включая даже ожидаемый результат. :) Но это также означает, что соответствующийкод недействителен.

В случае вашей программы есть попытки записи в память вне массива символов S1.

Произошло так, что компилятор поместил два массива сразу один за другим в порядке S1, а затем S2.Таким образом, фактически функция strcatt сама перезаписывает массив символов S2.

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

0 голосов
/ 16 июня 2019

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

char *strcpyt(char *dest, const char *str)
{
    char *result = dest;
    if(dest && str)
    {
        while(*dest++ = *src++);
    }
    return result;
}

size_t strlent(const char *str)
{
    const char *start = str;
    size_t length = 0;

    if(str)
    {
        while(*str++);
        length = str - start - 1;
    }
    return length;
}

char *strcatt1(const char *str1, const char *str2)
{   
    char *result = NULL; 
    size_t size;
    if(str1 && str2)
    {
        result = malloc((size = strlent(str1)) + strlent(str2) + 1);
        if(result)
        {
            strcpyt(result, str1);
            strcpyt(result + size, str2);
        }
    }
    return result;
}

char *strcatt2(char *buff, const char *str1, const char *str2)
{   
    char *result = buff; 
    size_t size;
    if(str1 && str2)
    {
        if(!result)
        {
            result = malloc((size = strlent(str1)) + strlent(str2) + 1);
        }
        if(result)
        {
            strcpyt(result, str1);
            strcpyt(result + size, str2);
        }
    }
    return result;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...