【发布时间】:2016-04-27 19:36:54
【问题描述】:
我正在考虑使用终止 '\0' 来替代 strncpy 以供我自己在头文件中使用,并且想知道以下哪种方法会更好。
int copystring(char *dest,char *source,int elements)
{
int run;
for(run=0;run<elements-1;run++)//last reserved for'\0'
{
dest[run]=source [run];
if (dest[run]=='\0')
{
break;
}
}
dest[elements-1]='\0';//could make conditional but not neccesary.
return 0;
}
或
int copystring(char *dest,char *source,int elements)
{
strncpy(dest,source,elements-1);
dest[elements-1]='\0';
return 0;
}
对我来说明显的区别是我在版本一中调用了一个更少的函数,但我想知道版本二是否有任何优势,因为我不知道 strncpy() 的内部工作原理
顺便说一句,为什么 strncpy() 将 size_t 作为最后的参数?如果它是用于传递 sizeof 值,这仅在非常有限的情况下有用,那么 int 不是也可以吗?
【问题讨论】:
-
strcopy还没有提供什么?此外,为什么您需要知道以 null 结尾的char *source的长度才能复制它? -
它对 dest 有缓冲区溢出保护。即我将使用“元素”来传递最大目标长度。
-
顺便说一句:
dest[run+1]='\0';-->>dest[run]='\0';(循环后运行已经递增) -
@KeithThompson 啊,绝对是,我打字太快了。
s/copy/cpy/g请。#define strcopy strcpy#define strncopy strncpy -
@Orangesandlemons 要明确:
copystring(dest, source, 0)调用strncpy(dest,source,0-1);是strncpy(dest,source,some_very_large_number);而不是strncpy(dest,source, -1);