传入的两个数组是常量,所以我创建了两个新数组。 第一个数组存储一组字符,第二个数组存储第二组字符。到目前为止,我假设第一组比第二组更大。 (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”字符。
答案 0 :(得分:1)
因为你声明了
char newarr2[512];
char newarr1[512];
作为大小512且未分配任何数据,strlen
将始终返回newarr1
和newarr2
的大小作为垃圾,因为您没有使用正确的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