«

字符串基本操作

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;  
    else  
        return 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;  
    else  
        return 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);\  
}  
分享