7.11 字符串

1.编写strcpy函数

char * strcpy( char *strDest, const char *strSrc )        
{       
    if(strDest == strSrc) { return strDest; }    
    assert( (strDest != NULL) && (strSrc != NULL) );       
    char *address = strDest;        
    while( (*strDest++ = * strSrc++) != '\0' );        
    return address;       
}  
注意一些问题: 由于局部变量存在栈区,所以非动态生成的变量得到的地址是向下的,可能dest的空间不足覆盖到src。注意dest与src有重叠,需要从高字节往低字节复制。

dst <= src || (char *)dst >= ((char *)src + count)这种是不重叠的。


2.atoi函数,itoa函数。

a-to-i字符串转换成整数,注意:参数NULL的判断,前导空格,符号正负,边界截止。

//代码转自csdn博客
//inf用来标记作为判断是否越界
//atoiFlag作为是否是正确结果的返回值
const __int64 inf = (0x7fffffff);
int atoiFlag;
int atoi(const char* ch)
{
	ASSERT(ch != NULL);
	atoiFlag = false;
	while (*ch == ' ' || *ch == '\t')
		ch ++;
	int isMinus = 1;
	if (*ch == '-')
	{
		isMinus = -1;
		ch ++;
	}
	else if (*ch == '+')
	{
		ch ++;
	}
	//判断非法
	if (!(*ch <= '9' && *ch >= '0'))
		return 0;
	__int64 ans = 0;
	while (*ch && *ch <= '9' && *ch >= '0')
	{
		ans *= 10;
		ans += *ch - '0';
		//判断越界
		if (ans > inf)
		{
			return inf;
		}
		ch ++;
	}
	ans *= isMinus;
	atoiFlag = true;
	return (int)ans;
}

//如何使用
int main()
{
	char a[100];
	while (scanf("%s", a) != EOF)
	{
		int ans = atoi(a);
		if (atoiFlag)
			printf("%d\n", ans);
		else if (ans == inf)
			puts("The data of crossing the line");
		else
			puts("Not is a integer");
	}
	return 0;
}

i-to-a整型转换成字符串。

#include <stdlib.h> 
#include <stdio.h> 
char *myitoa(int num,char *str,int radix);
int main() 
{ 
	int number = -123456; 
	char string[25]; 
	myitoa(number, string, 16); 
	printf("integer = %d string = %s\n", number, string); 
	return 0; 
} 
/* 实现itoa函数的源代码 */ 
char *myitoa(int num,char *str,int radix) 
{  
	/* 索引表 */ 
	char index[]="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 
	unsigned unum; /* 中间变量 */ 
	int i=0,j,k; 
	/* 确定unum的值 */ 
	if(radix==10&&num<0) /* 十进制负数 */ 
	{ 
		unum=(unsigned)-num; 
		str[i++]='-'; 
	} 
	else unum=(unsigned)num; /* 其他情况 */ 
	/* 逆序 */ 
	do  
	{ 
		str[i++]=index[unum%(unsigned)radix]; 
		unum/=radix; 
	}while(unum); 
	str[i]='\0'; 
	/* 转换 */ 
	if(str[0]=='-') k=1; /* 十进制负数 */ 
	else k=0; 
	/* 将原来的“/2”改为“/2.0”,保证当num在16~255之间,radix等于16时,也能得到正确结果 */ 
	char temp; 
	for(j=k;j<=(i-k-1)/2.0;j++) 
	{ 
		temp=str[j]; 
		str[j]=str[i-j-1]; 
		str[i-j-1]=temp; 
	} 
	return str; 
} 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值