strcpy 使用不.太.安全,strcpy_s只是windows下的,且在release版本也会弹出警告框,不太爽。
所以还是用strncpy比较好,在windows下可以预定义#define _CRT_SECURE_NO_WARNINGS(要定义在包含string.h头文件的前面),来屏蔽掉使用_s版本之类的warning。
但是使用strncpy也是有一个需要注意的地方,就是它有时是不会给你在字符串结尾加上‘\0‘的。
/* Copies count characters from the source string to the destination. If count is less than the length of source, NO NULL CHARACTER is put onto the end of the copied string. If count is greater than the length of sources, dest is padded with null characters to length count. so, should use like: char buf[N]; strncpy(buf, "123", N);// or: strncpy(buf, "123", N-1); buf[N-1] = ‘\0‘; //res: 1,2,3,\0(,\0...) 1,2,\0 (if N=3) */ char buf[4] = {}; char buf3[4] = {}; char buf2[] = "122343345"; strncpy(buf, buf2, 4); strcpy_s(buf3, 4, "123"); //char buf10[6]; char buf11[6]; strncpy(buf11, "123", 6);//1,2,3,\0,\0,\0 //memcpy(buf11, (void*)0x00001234, sizeof(buf11)); //memcpy(buf11, buf10, sizeof(buf11)); memcpy(buf11, buf11 - 6, sizeof(buf11));//mk dest uninit strncpy(buf11, "123", 5);//1,2,3,\0,\0,? memcpy(buf11, buf11 - 6, sizeof(buf11));//mk dest uninit strncpy(buf11, "123", 3);//1,2,3,?,?,? memcpy(buf11, buf11 - 6, sizeof(buf11));//mk dest uninit strncpy(buf11, "123", 1);//1,?,?,?,?,? // strncpy(buf11, "1234567", 6+1);//1,2,3,4,5,6[,7]: no assert, over write mem behind, then will crash
本文出自 “v” 博客,请务必保留此出处http://4651077.blog.51cto.com/4641077/1613796
原文地址:http://4651077.blog.51cto.com/4641077/1613796