字符串基本操作

来源:互联网 发布:js对象转换json字符串 编辑:程序博客网 时间:2024/05/17 01:39

1、计算字符串的长度

版本1:

int strlen(const char* str){int len = 0;while (*str++)len++;return len;}

版本2:

int strlen(const char* str){const char *end;end = str;while (*end++) ;return end-str-1;}

版本3:不使用全局和局部变量,用递归

int strlen(const char *str){if (*str == '\0')return 0;elsereturn 1+strlen(str+1);}

版本4:不使用全局和局部变量,写两个函数,版本2的变形,避免字符串很长时版本3递归栈过深

const char* ToEnd(const char *str){while (*str++) ;return str;}int strlen(const char *str){return ToEnd(str)-str-1;}

2、字符串的比较

int strcmp(const char* src, const char* dst){int temp;while (!(temp=*src-*dst) && *src) {src++;dst++;}if (temp<0)return -1;else if (temp>0)return 1;elsereturn 0;}

3、字符串拷贝

char* strcpy(char* dst, const char* src){char *p = dst;while (*p++=*src++) ;return dst;}

考虑字符是否相同,以及指针是否为空避免溢出后:

char* strcpy(char* dst, const char* src){if (dst == src) return dst;assert((dst != NULL) && (src != NULL));char *p = dst;while (*p++=*src++) ;return dst;}

4、字符串拼接

char* strcat(char* dst, const char* src){char *p = dst;while (*p) p++;while (*p++=*src++) ;return dst;}

5、字符串翻转

版本1:

char* strRev(char* str){char *start, *end;start = str;end = str + strlen(str)-1;while (start<end){char temp = *start;*start++ = *end;*end-- = temp;}return str;}

版本2:不使用中间变量

char* strRev2(char* str){char *start, *end;start = str;end = str + strlen(str)-1;for (; start<end; start++, end--){*start ^= *end;*end ^= *start;*start ^= *end;}return str;}
此版本基本原理:

(1)一个变量按位异或自己的结果为0,即:a ^ a = 0;
(2)一个变量按位异或0的结果为自己,即:a ^ 0 = a;


相关补充:

题目:有2数据,写一个交换数据的宏。

版本1:但若变量值很大时可能会发生溢出

a=a+b,b=a-b,a=a-b

版本2:利用内存复制,但size与temp可能会与原程序中的变量重名

#define swap(a,b) \{\int size = sizeof(a);\char* temp = (char*)malloc(size);\memcpy(temp, &a, size);\memcpy(&a, &b, size);\memcpy(&b, temp, size);\free(temp);\}


原创粉丝点击