• 指针与字符串


    开始之前必须明确strlen的含义,原型为size_t strlen( char *str ); strlen返回字符串的长度,即null(\0)之前的字符的数量。

    一 char* 与 char []

    实例加注释:

    复制代码
    Code
    void TestCharPointerAndArray()
    {
       
    char *c1 = "abc"; //abc\0常量区,c1在栈上, 常量区程序结束后自动释放。
       
    //c1[1] = 'g'; // 常量不能修改
        int i = strlen(c1); // 3

       
    char c2[] = "abc"; // c2,abc\0都在栈上
        c2[1] = 'g'; // 可以修改
        int j = strlen(c2); // 3
        int jj = sizeof(c2); // 4

       
    char *c3 = ( char* )malloc(4* sizeof(char)); // c3 栈上
        memcpy(c3,"abc",4); // abc\0 在堆上, 4 = 3(strlen("abc")) + 1('\0');
        c3[1] = 'g'; // 可以修改
        int x = strlen(c3); // 3
        free(c3); //如果这里不free,会内存泄漏
        c3 = "abc"; // abc\0 在常量区,c3指向了常量区
       
    //c3[1] = 'g'; // 常量不能修改
        int y = strlen(c3); // 3
    }
    复制代码

    字符串都以\0结尾,所以例如:char *c1 = "abc";char c2[] = "abc";,使用strlen得到长度都为3,但是实际的存储空间为strlen+1即3+1。

    二 C中字符串操作函数

    C++的程序员对C中的字符串指针操作的函数却并不是相当的熟悉。而C中的这些字符串的指针操作函数有的时候也是必须要面对的,比如我们的库要提供C函数接口,保持向后兼容和跨平台,还有我们经常使用一些第三方的库中都或多或少的使用到了这些C中的指针操作函数,所以下面列出C的指针操作函数,帮助大家熟悉之。

    1) memcpy/memset/memcmp

        memcpy

    原型:extern void *memcpy( void *to, const void *from, size_t count );
    包含:#include <string.h> 或<string>或<cstring>
    功能:由src所指内存区域复制count个字节到dest所指内存区域。
    说明:src和dest所指内存区域不能重叠,函数返回指向dest的指针。

        memset

    原型:extern void* memset( void* buffer, int ch, size_t count );
    包含:#include <string.h> 或<string>或<cstring>
    功能:把buffer所指内存区域的前count个字节设置成字符c。
    说明:返回指向buffer的指针。

       memcmp

    原型:extern int memcmp(const void *buffer1, const void *buffer2, size_t count );
    包含:#include <string.h> 或<string>或<cstring>
    功能:比较内存区域buf1和buf2的前count个字节。
    说明:
            当buf1<buf2时,返回值<0
            当buf1=buf2时,返回值=0
            当buf1>buf2时,返回值>0



        memchr
    原型: extern void *memchr( const void *buffer, int ch, size_t count );
    包含:#include <string.h> 或<string>或<cstring>
    功能:查找ch在buffer中第一次出现的位置。
    说明:如果发现返回指针,如果没有返回NULL。

    实例:

    复制代码
    Code
    void TestMemFunction()
    {
       
    char *s1="Hello!"; // Hello!\0
        int l = strlen(s1); // 6
        char *d1 = new char[l+1]; // d1 需要strlen(s1) + 1 空间
        memcpy(d1,s1,l+1);

        memcpy(d1,d1,l);

        memmove(d1
    + 1,d1,l-1);

       
    const int ARRAY_LENGTH = 5;
       
    char the_array[ARRAY_LENGTH];
       
    // zero out the contents of the_array
        memset( the_array, 'c', ARRAY_LENGTH );

       
    char *a1 = "source1";
       
    char arr1[8] = "source2";
       
    int r = memcmp(a1,arr1,strlen(a1) - 1); // 仅比较source,所以相等

       
    char str[17];
       
    char *ptr;
        strcpy(str,
    "This is a string");
        ptr
    = (char*)memchr(str, 'r', strlen(str));
    }
    复制代码

    2) strlen/strcpy/strcat/strcmp/strchr/strcoll/strstr/strtok/strtod/strtol


    strcpy

    char *strcpy(char *s1, const char *s2) 将字符串s2复制到字符串数组s1中,返回s1的值


    strcat

    char *strcat(char *s1, const char *s2)
    将字符串s2添加到字符串s1的后面。s2的第一个字符重定义s1的null终止符。返回s1的值



    strcmp

    int strcmp(const char *s1, const char *s2)
    比较字符串s1和字符串s2。函数在s1等于、小于或大于s2时分别返回0、小于0或者大于0的值

    strchr

    char *strchr(char * str,int c ); 在str中查找c第一次出现的位置。

    strstr char *strstr(char *str,const char *strSearch );在string1中查找string2第一次出现的位置。
    strtok char *strtok(char *strToken,const char *strDelimit ); 分割字符串。

    实例:

    复制代码
    Code
    void TestStrFunction()
    {
        
    char string[11];
        
    char *str1 = "123456789"// 123456789\0
        strcpy(string, str1);

        strcat(
    string,"A"); //123456789A\0

        
    int r = strcmp(string,"123456789B"); // 123456789A\0 < 123456789B\0
    }

    void TestStrFunction2()
    {
        
    int  ch = 'r';
        
    char string[] = "The quick # brown dog # jumps over # the lazy fox";
        
    char *pdest = NULL;
        pdest 
    = strchr( string, ch );

        pdest 
    = NULL;
        
    char * str = "dog";
        pdest 
    = strstr(string,str);

        pdest 
    = NULL;
        
    char delims[] = "#";
        pdest 
    = strtok( string, delims );
        
    while( pdest != NULL ) 
        {
            pdest 
    = strtok( NULL, delims );
        }
    }
    复制代码

    总结:

    1)以mem开始的函数用来bytes的操作,所以需要指定长度,但是以str用来操作以\0结尾的字符串,不需要指定长度。

    2)对于unicode,相应的字符串操作函数前缀为wcs,例如wcscpy,wcscat,wcscmp,wcschr,wcsstr,wcstok等。

    3)在vc中还提供了有安全检测的字符串函数后缀_s,例如strcpy_s,strcat_s,strcmp_s,wcscpy_s,wcscat_s,wcscmp_s等。

    4)char*如果指向常量区,不能被修改,且此char*不需要delete。例如 char* pStr = "ABC";。

    三 std::string和std::wstring使用相当简单哦!

    四 完!

    感谢,Thanks!

  • 相关阅读:
    关于because the weaver option '-Xset:weaveJavaxPackages=true' has not been specified报错的解决方案
    对不起,这是一篇负能量爆棚的文章
    selenium启动报错“ incorrect JSON status mapping for 'unknown error' (500 expected)”
    解决关于win10下eclipse代码格式化不生效问题
    递归遍历所有xml的节点及子节点
    性能调优-CPU方面,内存方面
    二进制日志备份与恢复,快照备份,复制
    逻辑备份,mysqldump,SELECT…INTO OUTFILE,恢复
    备份与恢复概述,冷备,热备
    分布式事务,不好的事务习惯
  • 原文地址:https://www.cnblogs.com/cy568searchx/p/2844386.html
Copyright © 2020-2023  润新知