gpt4 book ai didi

c++ - strcpy... 想替换为 strcpy_mine,它将 strncpy 和 null 终止

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:06:03 28 4
gpt4 key购买 nike

线索在标题中,但基本上我继承了一些代码,其中有 800 多个 strcpy 实例。我想写一个新函数,然后用 strcpy_mine 替换 strcpy。

所以我正在尝试找出 strcpy_mine 的参数列表。

我试过:

void strcpy_mine( char* pTarget, const char* const pCopyMe )
{
const unsigned int lenAlwaysFour = sizeof(pCopyMe ); //:(
strncpy( pTarget, pCopyMe, lenAlwaysFour );

//add extra terminator in case of overrun
pTarget[lenAlwaysFour] = 0;
}

但是sizeof总是4 pCopyMe是一个指针

我不想做的是替换

strcpy (buf, pCopyMe);

strncpy (buf, pCopyMe, sizeof(pCopyMe)); buf[sizeof(pCopyMe)] = 0;

有什么想法吗? (strcpy_l 不可用)

最佳答案

sizeof() 返回类型的大小 - 在本例中 const char* const 在 32 位机器上为 4。

我想你认为你想要 strlen()。但这不是使用 strncpy 函数的正确方法。您需要 strncpy 的输出 缓冲区的大小。

要解决此问题,您需要检查每个调用站点的代码,计算出输出缓冲区的大小,并将其作为参数传递给 strcpy_mine。如果 strcpy(或 strcpy_mine)的调用站点不知道输出缓冲区的大小,则需要在代码中向后搜索分配缓冲区的位置,并将大小一直传递到 strcpy 站点.

基本上,您不能为采用相同参数的 strcpy 编写一个替代品,并希望避免首先产生 strncpy 的问题(以及更好的替代品)。您可以创建一个函数,它采用与 strncpy 相同的参数,但确保结果以 null 终止 - 查看 OpenBSD's strlcpy() 的实现功能。但第一步必须是更改调用站点以传递输出缓冲区大小的知识。

关于c++ - strcpy... 想替换为 strcpy_mine,它将 strncpy 和 null 终止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/951119/

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