线索是在标题但基本上我继承其具有的strcpy的800+实例一些代码。我想编写一个新的函数,然后用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不可用)

欢呼声

有帮助吗?

解决方案

根据不同的调用点看起来怎么样,往往大多数情况下,可以通过一个简单的模板来处理:

#include <string.h>

template <int bufferSize>
void strcpy_mine( char (&pTarget)[bufferSize], const char* const pCopyMe )
{
  strncpy( pTarget, pCopyMe, bufferSize-1 );

  //add extra terminator in case of overrun
  pTarget[bufferSize-1] = 0;
}

int main()
{
  char buf[128];
  strcpy_mine(buf,"Testing");
  return 0;
}

如果您使用Microsoft Visual Studio 2005或更新,请参阅的安全模板重载,了解微软的实现。

其他提示

的sizeof()返回类型的大小 - 在这种情况下const char* const这将是4上32位机器

我想你想你想strlen()。但是,这是不使用strncpy()函数功能的正确途径。 需要的输出缓冲区函数strncpy的大小。

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

基本上可以不写为strcpy的替换的下降,是以相同的参数,并希望避免在首位(和更好的替代超出)产生函数strncpy的问题。您可以创建一个函数,它接受相同的参数strncpy()函数,但能保证结果是空值终止 - 看的 OpenBSD的是strlcpy()函数。但在第一步骤中必须改变主叫站点传递于输出缓冲器大小的知识。

略外围也许,但因为没有人提到它,它标榜的称号:你不能(合法)编写一个名为strcpy_mine()全局函数

在的名字开始str被保留用于标准库函数“命名空间”。见,例如,接受的答案,这问题

您可以使用相同的参数列表,函数strncpy您strcpy_mine,但这样它总是空终止结果写出来。不应该是很难做到的。

的一个挑战,但是,是一些现有的代码的调用的strcpy()可能不知道的缓冲区的大小,无论是。

另外可以使用用于避免多个编辑位macroses。或通过自动化脚本的一些编辑。

您一定需要在目标缓冲区作为参数的大小来传递,因为其他人已经在上面所述。

这是怎么样的题外话,但我只是想指出的是,你使用strncpy()后,您需要设置为null缓冲区的最后一个字符,其中有指数的少1 的比长度(未缓冲的长度):

strncpy (buf, pCopyMe, buflen); buf[buflen - 1] = '\0';

或者,你可以在一个空字符串使用strncat(),传递给它的长度为1以下,这将保证空终止您的字符串:

buf[0] = '\0'; strncat (buf, pCopyMe, buflen - 1);

道格拉斯Leeder先生具有的权利。还有就是要替代的strcpy的有用的限制,除非你愿意做一个良好的,健全的缓冲区长度穿过在每个实例的繁重工作。这是一个很大的工作!

好消息是,这是值得的!回到几年前,我到几个C ++项目未按时,越野车,和不可靠的。通过声明的strcpy和strlen的禁止,并采取2-3天出该项目的自定义函数strncpy / strnlen,在所有这些项目中,我们突然能为天,而不是小时运行,以取代他们。我们也看到了很多截断的字符串出来的屏幕显示和日志文件。这给了我们追踪截断问题所需要的线索,以前崩溃的问题。

如果你不想这样做,你可以通过简单地检查NULL两个指针参数,并限制的字符串拷贝的最大尺寸和已到达记录所有倍的边界得到一个更小的好处。 不要做任何参数的strlen的,因为strlen的将在你快乐地崩溃,如果该字符串不是正确的空值终止的。

目前,新上项目使用好字符串对象,但有很多的遗留代码在那里,没有。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top