这几个strcpy到底有多大的区别
还是K&R书中的程序:
void strcpy1(char *s,char *t)
{
int i = 0;
while((s[i] = t[i]) != '\0')
i++;
}
void strcpy2(char *s,char *t)
{
while((*s = *t) != '\0')
{
s++;
t++;
}
}
void strcpy3(char* s,char* t)
{
while((*s++ = *t++) != '\0')
;
}
void strcpy4(char *s, char* t)
{
while(*s++ = *t++)
;
}
区别不大,最后一种最好懂,并且省了中间变量i,省了与0进行比较,直接将值作为布尔值使用,速度也会快些。
不建议像楼上所说的那样使用strncpy代替strcpy
strncpy是可以防止缓冲溢出,但这是不良的习惯,而且运行效率会低于strcpy,也因为这才没有用strncpy直接代替strcpy,而只是做为strcpy的一个补充。
如果出现缓冲溢出,
1.是处理的字符串出现了异常,属于非法状态下的输入,此时需要进行相应处理,还可能需要直接弹出错误。
2.是缓冲区分配错误,此时需要重新修正缓冲区分配算法。
而依靠strncpy是十分可怕的,因为它会让错误被掩盖了。我们不怕程序崩溃,就怕有错误,程序还依然能运行。得到的结果却不是我们想要的。strncpy是自作主张的进行截断,最后的结果就会变成不可预期。
strcpy过界是可以检测出来的,编译器也可产生警告甚至直接崩溃。但strncpy产生的不可预期结果是很难检测的。如你要找一个“小明女朋友”的信息,结果被截断成“小明”,一切都正常,只不过你永远不知道你得到的信息其实不是小明女朋友的,而是小明的。
所以安全的做法是自己在调用前就做检查,一般需要检查长度是否比缓冲区大,指针是否为空。
再说 没发现错误 你这样调用出现崩溃的可能性更大 更容易察觉到代码有BUG
请教下如何驾驭,比如有数组char szData[256] = {0};strcpy(szData,szSrc);szSrc是运行时获取到的数据,如果是个错误的数据,其“长度”很有可能超过256。另“_s 后缀的就算了”能否指点下,是因为运行效率低还是一样不安全?
使用所谓的安全函数_s 呵呵 你加长度限制了 代码运行正常安全没奔溃了 你觉得这样更容易查找BUG??
//代码一
char szBuffer[6] = {0};
strcpy(szBuffer,"123456789");
//代码二
char szBuffer[6] = {0};
strcpy_s(szBuffer,sizeof(szBuffer),"123456789");
区别不大,最后一种最好懂,并且省了中间变量i,省了与0进行比较,直接将值作为布尔值使用,速度也会快些。
不建议像楼上所说的那样使用strncpy代替strcpy
strncpy是可以防止缓冲溢出,但这是不良的习惯,而且运行效率会低于strcpy,也因为这才没有用strncpy直接代替strcpy,而只是做为strcpy的一个补充。
如果出现缓冲溢出,
1.是处理的字符串出现了异常,属于非法状态下的输入,此时需要进行相应处理,还可能需要直接弹出错误。
2.是缓冲区分配错误,此时需要重新修正缓冲区分配算法。
而依靠strncpy是十分可怕的,因为它会让错误被掩盖了。我们不怕程序崩溃,就怕有错误,程序还依然能运行。得到的结果却不是我们想要的。strncpy是自作主张的进行截断,最后的结果就会变成不可预期。
strcpy过界是可以检测出来的,编译器也可产生警告甚至直接崩溃。但strncpy产生的不可预期结果是很难检测的。如你要找一个“小明女朋友”的信息,结果被截断成“小明”,一切都正常,只不过你永远不知道你得到的信息其实不是小明女朋友的,而是小明的。
所以安全的做法是自己在调用前就做检查,一般需要检查长度是否比缓冲区大,指针是否为空。
楼上提到 strncpy的只有我了
貌似你是在说我 那么我就得澄清一下了
我说 strncpy 是表达 有比_s后缀的函数 更好一点的选择
至于你说的 不怕崩溃 怕出错了还正常运行
那其实和我在20楼的说法是一致的