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;
}