使两个数组长度相同。 C(89)

时间:2015-02-07 22:48:56

标签: c arrays

传入的两个数组是常量,所以我创建了两个新数组。 第一个数组存储一组字符,第二个数组存储第二组字符。到目前为止,我假设第一组比第二组更大。 (a,b,c,d> x,y)。 程序希望完成的是制作两个包含相同字母的新数组,但在这种情况下,较短的数组arr2(newarr2)重复它的最后一个字符,直到它匹配第一个数组的长度。 正确解决方案的例子。 (a,b,c,d< x,y) - > equate_arr - > (a,b,c,d = x,y,y,y)

void equate_arr(char arg2[], char arg1[]){
    size_t i = 0;
    size_t len1 = strlen(arg1);
    size_t len2 = strlen(arg2);
    char newarr2[512];
    char newarr1[512];

    while(i < (strlen2 - 1))
    {
        newarr2[i] = arg2[i];
        i++;
    }

    i = 0;

    while(i < (strlen1 - 1))
    {
        newarr1[i] = arg1[i];
        i++;
    }

    i = 0;

    while(strlen(newarr2) < strlen(newarr1))
    {
        newarr2[strlen(newarr2)] = newarr2[strlen(newarr2)-1]
    }   
}

目前我不知道发生了什么,因为一旦我在我的代码中摆弄这个功能,程序似乎不再运行了。很抱歉询问这个项目我正在努力,但我确实需要一些帮助。

如果需要,我可以将整个程序放在这里。

修订

void tr_non_eq(char arg1[], char arg2[], int len1, int len2)
{
int i = 0;
char* arr2;
arr2 = (char*)calloc(len1+1,sizeof(char));
while(i < len2)
{
    arr2[i] = arg2[i];
    i++;
}

while(len2 < len1)
{
    arr2[len2] = arg2[len2-1];
    len2++;
}

tr_str(arg1, arr2);
}

现在输入(a,b,c,d,e,f)和(x,y)以及一个字符串“cabbage”来翻译程序打印出“yxyyx”并用字符串“abcdef”打印出来“xyy”表示承诺。我不太清楚为什么arr2数组没有按照预期填充“y”字符。

2 个答案:

答案 0 :(得分:1)

因为你声明了

char newarr2[512];
char newarr1[512];

作为大小512且未分配任何数据,strlen将始终返回newarr1newarr2的大小作为垃圾,因为您没有使用正确的NULL字符结束字符串。

while(strlen(newarr2) < strlen(newarr1))
{
    newarr2[strlen(newarr2)] = newarr2[strlen(newarr2)-1]
} 

这个while循环无法正常工作。

for ( i = len2; i < len1; ++i )
    newarr2[i] = newarr2[len2-1]

如果len2总是小于len1,则可以使用上面的循环 如果你不知道哪个数组会大于,

size_t len1 = strlen(arg1);
size_t len2 = strlen(arg2);
char* newarr1;
char* newarr2;
int i;

if ( len1 >= len2 )
{
    newarr1 = (char*)calloc(len1+1,sizeof(char));
    newarr2 = (char*)calloc(len1+1,sizeof(char));
}
else
{
    newarr1 = (char*)calloc(len2+1,sizeof(char));
    newarr2 = (char*)calloc(len2+1,sizeof(char));
}
for ( i = 0; i < len1; ++i)
    newarr1[i] = arg1[i];
for ( i = 0; i < len2; ++i)
    newarr2[i] = arg2[i];
if( len1 >= len2 )
{
   for ( i = len2; i < len1; ++i )
      newarr2[i] = newarr2[len2-1];
}
else
{
   for ( i = len1; i < len2; ++i )
      newarr1[i] = newarr1[len1-1];
}

稍后释放内存

答案 1 :(得分:1)

正如去复制者所说,正如你的代码所代表的那样,它实际上没有任何成就。更重要的是,它试图做的事情充满了危险。

使用strlen来确定参数长度的事实清楚地表明equate_arr不期望接收两个char数组。相反,它需要两个NUL终止的C风格字符串。所以宣言应该更像是:

void equate_arr(const char *arg2, const char *arg1)

这使合同更清晰。

但请注意返回类型:void。这表示您的函数不会向调用者返回任何值。那么,你是如何计划返回修改后的数组的呢?

下一个的危险在于以下几点:

char newarr2[512];
char newarr1[512];

如果使用大于511个字符的字符串(加上NUL)调用此函数会发生什么? “缓冲区溢出”这个短语应该在这里跳出来。

你需要的是malloc缓冲区足够大以容纳传入的最长字符串的副本。但这就提出了如何将新数组交给调用者的问题(请记住{{1}返回类型?)。

这里还有许多其他问题,很大程度上是因为没有明确定义这个函数要达到的合同。

现在,当我仔细观察时,还有一个

void

第一次通过此循环会覆盖while(strlen(newarr2) < strlen(newarr1)) { newarr2[strlen(newarr2)] = newarr2[strlen(newarr2)-1] } 中的终止NUL,这意味着对newarr2的下一次调用将进入未定义的行为,因为它完全受到任何垃圾的影响。你的筹码。

如果您对C风格的字符串不清楚,请查看我对this问题的回答,该回答详细介绍了它们。

以下是白板代码(即未编译,未经测试),它可以完成您想要实现的目标。这纯粹是为了参考

strlen