透过strcpy()看问题

转载请注明原文来自:http://blog.youkuaiyun.com/lizhiliang06/article/details/8649336

小明最近写程序发现经常会出现一些莫名其妙的错误,

就过来问大明,说程序总是出现问题的,而且莫名其妙的就挂在了strcpy这里了,

郁闷了挺久的了,于是刚毕业不久的小明还是不太好意思的来问了大明,

大明看了小明的代码,发现了一些问题,这些问题是平时写程序不太注意时经常发生的哦,

现在就展开来让大家一起看看大笑


#include <stdio.h>
/*
 * 注意所犯错误1
 */
void error1()
{
	char str0[10];
	char *str1 = "0123456789"; 
	strcpy(str0, *str1);
}

/*
 *注意所犯错误2
 */
void error2()
{
	char str0[10];
	char str1[10];
	int i = 0;

	for(i=0; i<10; i++)
	{
		str1[i] = 'a';	
	}

	strcpy(str0, str1);
}

/*
 *注意所犯错误3
 */
void error3(char *str1)
{
	char str0[10];
	int len = strlen(str1);
	if(len <= 10)
		strcpy(str0, str1);
}

void main()
{
	error1();
	error2();
	error3("001123456789");/*注意*/

}

下面是对以上所犯错误做修正:

/*
 * 注意所犯错误1修正
 */
void right1()
{
	char str0[11] = {0};
	char *str1 = "0123456789"; 
	strcpy(str0, str1);
}

/*
 *注意所犯错误2修正
 */
void right2()
{
	char str0[11] = {0};
	char str1[11] = {0};
	int i = 0;

	for(i=0; i<10; i++)
	{
		str1[i] = 'a';	
	}

	strcpy(str0, str1);
}

/*
 *注意所犯错误3修正
 */
void right3(char *str1)
{
	char str0[10] = {0};
	int len = strlen(str1);
	if(len < 10)
		strcpy(str0, str1);
}

void main()
{
	right1();
	right2();
	right3("001123456789");/*注意*/

}

请写出strcpy()原型设计代码:

比较常见的犯错应该像下面代码了,

/*请写出strcpy()函数原型*/
/*
*注意1
*/
void strcpy(char *dest, char *source)
{
	while(*source != '\0')
		 *dest++ = *source++;
}

/*
 * 注意2 加上const,防止参数被改变
 */
void strcpy(char *dest, const char *source)
{
	while(*source != '\0')
		 *dest++ = *source++;
}

/*
 * 好的strcpy应该如下
 */
void strcpy(char *dest, const char *source)
{
	assert((dest != NULL) && (source != NULL));

	const char *temp_src = source;
	char *temp_dest = dest;//防止过程中改变dest的地址

	while(*temp_src != '\0')
		 *temp_dest++ = *temp_src++;
}

转载请注明原文来自:http://blog.youkuaiyun.com/lizhiliang06/article/details/8649336

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值