7.11 字符串

来源:互联网 发布:js图片点击弹出放大 编辑:程序博客网 时间:2024/05/18 01:36

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");elseputs("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