zoukankan      html  css  js  c++  java
  • 指针与字符串

    开始之前必须明确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!

  • 相关阅读:
    jQuery 语法
    jQuery 简介
    把数据存储到 XML 文件
    XML 注意事项
    XML DOM (Document Object Model) 定义了访问和操作 XML 文档的标准方法。
    通过 PHP 生成 XML
    XML 命名空间(XML Namespaces)
    XML to HTML
    XMLHttpRequest 对象
    使用 XSLT 显示 XML
  • 原文地址:https://www.cnblogs.com/cy568searchx/p/2844386.html
Copyright © 2011-2022 走看看