如何复制strncat(原始)
How to duplicate strncat (original)
我的字符串NAdd函数将复制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] != ' '; i++)
i==num;
str1[str1_len+i] = str2[i];
str1[str1_len+i] = ' ';
return str1;
}
输出:
使用strncat函数,该部分添加
使用strncat函数,该部分添加
问题是,您不能在相同的条件下测试这两个函数:一旦执行了strncat()
,dest
就已经包含了更长的串联版本。
第二个问题是dest
已经被放大了15个字符。因此,在调用stringNAdd()
之前,它的初始长度为38个字符+空终止符。再添加15个字符会得到一个53个字符的字符串加上一个null终止符,这比数组长4个字符。因此,您将得到缓冲区溢出,从而导致内存损坏和未定义的行为。
但所有这些都与测试条件有关:您的克隆工作正常。
建议:
在不同的块中运行函数,并在该块的本地定义测试变量:
{
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()
所做的。
最后,你可以问你的老师,既然有更方便、更安全的std::string
,为什么他/她仍然让你使用cstrings,而且他肯定可以找到更现代、具有同样教学优势的练习。
以下是基于https://opensource.apple.com/source/Libc/Libc-167/gen.subproj/i386.subproj/strncat.c
#include <iostream>
char *strnadd(char *dst, const char *src, size_t n)
{
// abort if source is empty
if (n != 0)
{
// copy pointers
char *d = dst;
const char *s = src;
// find end of destination str
while (*d != 0)
d++;
// start copying chars from source str to the end of destination str
// until either source string ends or number of chars copied
// destination string has to be long enough to accommodate source
do
{
if ((*d = *s++) == 0)
break;
d++;
}
while (--n != 0);
// add null termination
*d = 0;
}
// return the resulting string
return dst;
}
int main()
{
char strCat[50];
char strAdd[50];
strcpy(strCat, "string1");
strcpy(strAdd, "string1");
char const *str2 = "string2";
std::cout << strncat(strCat, str2, 6) << std::endl;
std::cout << strnadd(strAdd, str2, 6) << std::endl;
return 0;
}
打印:
string1string
string1string
相关文章:
- 将浮动的heightmap数组导出为16位原始值
- 给定一个向量,如何找到该向量的所有子集和的原始索引
- 有没有办法从非C/C++文件中读取C++原始字符串文字的内容
- 是否可以将llvm::FunctionType转换为C/C++原始函数指针
- 如何将原始字节附加到 std::vector?
- 从堆栈分配的原始指针构造智能指针
- 如何重写全局方法名称以在调用原始方法之前将我的代码推到前面
- 将unique_ptr分配给原始指针
- 是否可以从 OpenGL 缓冲区获取原始大小的像素?
- 使用 OpenSSL 从内存中读取原始 SSL/TLS 证书
- 如何将唯一指针的 std::vector 转换为原始指针的 std::span?
- 从原始字节解码协议缓冲区(以 C++为单位)
- C ++如何在原始抽象类中创建一个函数,该函数接受派生类的输入
- C++:尝试使用等效的 STL 算法消除原始循环
- 如何在连接器 C++ 中将原始字节转换为字符串
- 通过引用传递类不会更改原始类
- 实现使用模板化类而不使原始类成为模板的类
- 如何在 2d 矢量 c++ 中复制元素并将其放在原始元素旁边
- 打印原始阵列和更改的阵列
- 如何复制strncat(原始)