码迷,mamicode.com
首页 > 其他好文 > 详细

strncpy使用小结

时间:2015-02-11 18:49:14      阅读:182      评论:0      收藏:0      [点我收藏+]

标签:c++   c   strncpy   

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

strncpy使用小结

标签:c++   c   strncpy   

原文地址:http://4651077.blog.51cto.com/4641077/1613796

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!