使用while循环连接两个数组

时间:2019-06-16 09:28:29

标签: c arrays string while-loop concatenation

代码没有问题。我怀疑我们是否可以连接两个数组。我们了解到,一旦声明数组,就无法增加其大小。但是下面的代码似乎正在这样做。我们可以使用波纹管部件将元素添加到静态创建的数组中吗?

  

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 个答案:

答案 0 :(得分:1)

该功能本身是正确的,除了应按以下方式更新

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;
}

这就是变量inti的类型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。

但是,没有必要让另一个编译器按此顺序放置数组,而且字符数组之间也没有间隙。

答案 1 :(得分:0)

您对函数的调用是错误的,因为您没有足够的空间容纳第二个字符串。通常,此类函数自己分配内存或将缓冲区作为附加参数。在您下面的两个版本中,一个分配内存,第二个分配缓冲区。如果缓冲区为null,则为新字符串分配内存。您需要在不需要时释放它

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;
}