指針、字符串及字符串操作函數

開始之前必須明確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使用相當簡單哦!


本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/zhongjiekangping/archive/2009/09/08/4532708.aspx

發佈了20 篇原創文章 · 獲贊 2 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章