gpt4 book ai didi

c++ - 如何复制 strncat(原创)

转载 作者:行者123 更新时间:2023-11-30 02:22:47 25 4
gpt4 key购买 nike

我的 stringNAdd 函数将复制 strncat(原始)。我不能接受数组作为参数,但可以接受指针。我想知道我的代码是否正确?

固定代码如下:

#include <string>
#include <iostream>

using namespace std;

char *stringNAdd(char str1[], char str2[],size_t num);
int main()
{
char dest[50] = "Using strncat function,";
char src[50] = " this part is added and this is ignored";
cout<< strncat(dest, src, 20) << endl;
cout << stringNAdd(dest, src, 20) << endl;
cin.get();
return 0;

}

char *stringNAdd(char str1[], char str2[],size_t num){
size_t str1_len = strlen(str1);
size_t i;

for (i=0; i < num && str2[i] != '\0'; i++)
i==num;
str1[str1_len+i] = str2[i];
str1[str1_len+i] = '\0';

return str1;
}

Output:

Using strncat function, this part is added

Using strncat function, this part is added

最佳答案

问题是你没有在相同的条件下测试这两个函数:一旦你执行了strncat() , dest 已经包含更长的串联版本。

第二个问题是 dest 已经扩大了 15 个字符。因此,在调用 stringNAdd() 之前,它的初始长度为 38 个字符 + 空终止符。再添加 15 个字符会导致 53 个字符的字符串加上一个空终止符,这比您的数组长 4 个字符。所以你会得到一个缓冲区溢出,因此内存损坏和未定义的行为。

但这一切都与测试条件有关:您的克隆工作正常。

建议:

在不同的 block 中运行您的函数,并定义该 block 的本地测试变量:

{
char dest[50] = "Using strncat function,";
char src[50] = " this part is added and this is ignored";
cout<< strncat(dest, src, 15) << endl;
cout << strlen(dest)<<endl;
}
{
char dest[50] = "Using strncat function,";
char src[50] = " this part is added and this is ignored";
cout << stringNAdd(dest, src, 15) << endl;
}

考虑一个更安全的函数版本,其中您将有一个带有目标数组总长度的附加参数,以防止这些错误。这会增加代码的安全性。顺便说一句,这就是微软对 strncat_s() 所做的.

最后,你可以问你的老师为什么他/她仍然让你使用 cstrings,当有更方便和安全的 std::string 时,他当然可以找到更多具有相同教学优势的现代练习。

关于c++ - 如何复制 strncat(原创),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46961587/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com