挖墳字符串知識點

    不要懷疑,博主這次真的是在挖墳,今天整理筆記的時候纔看見,所以呢,就上來備份一下,這篇呢主要是說一些關於字符串函數的知識點,希望大家以後在使用的時候注意一下!

一、字符串基本知識
1.字符串:顧名思義,字符串即一串字符的組合,並且以NUL結尾,所以我們不能讓'\0'出現在字符串還           沒有結束的地方。
2.NUL:它本身並不是字符串的一部分而是一個我們用來判斷一個字符串結束與否的標識!
3.字符串的分類:常量字符串,字符串數組。

  • 常量字符串

          一般來說我們使用常量字符串來保存那些不需要被修改的字符串

  • 字符串數組

          存放在數組裏的字符串我們可以對其進行增刪和替換
注意:若我們要使用字符串函數必須引頭文件string.h
二、串操作函數
1、字符串的長度度量標尺:strlen
   函數原型:size_t strlen(char const *string)
   size_t是一個無符號整數類型 所以我們不可以用兩個strlen 的結果減法運算來判斷哪個字符串長。
   典型錯誤:if((strlen(str1)-strlen(str2)) >= 0)  該表達式的結果將永遠爲真
**表達裏面如果同時包含有符號和無符號數結果會變得不一樣
使用減法必須強類型轉換

int main ( )
{
           char  *arr = "ABCD";
           int ret1 = strlen( arr );
           int ret2 = strlen( arr ) - 10 ;
           printf( "%d    %d\n" , ret1, ret2 );
           system( "pause" );
           return 0 ;
}

結果: 4    -6

2.容易失控的不受長度限制串操作函數

  • 字符串拷貝函數strcpy

    由於字符串拷貝函數不能檢測字符串的長度,你給它多少個字符它就拷貝多少個字符,但在程序執行時,多出來的字符會按順序存放在內存空間中,這樣是十分不安全的,你有可能覆蓋掉了內存中其他重要的信息。
    當原串和目標串出現內存重疊的時候我們應該考慮原串裏面的內容會被覆蓋並丟失,此時我們應該選擇內存拷貝函數memmove來解決這個難題
如果新的字符串短於原字符串那麼原字符串裏結尾的幾個字符也無法顯示,因爲在拷貝時它將字符串裏的‘\0’也一起拷貝過來,導致原串中最後幾個字符落在NUL的後面!

  • 字符連接函數strcat

    strcat函數同樣不受到長度的限制,我們在將一個字符連接到另一個字符串後面的時候選擇strcat函數,在我們使用時同樣要給目標字符串預留出足夠的空間來容納我們的源串,並且保證它們不會發生內存的重疊。
    如果你需要連接的字符串的長度加上目標字符串的長度超過了目標串的總長則會發生段錯誤!
    不能自己連接自己!

  • 字符串的比較函數strcmp

    字符串的比較函數strcmp的原理是將字符串裏的每一個對應字符進行比較,直到找到第一個不相等的字符比較他們的ASCII碼值後給出結論!
被比較的兩個字符串可以長度不同,如果前面的字符都相同,那麼短的那個字符串更小!
    有一個常見的問題,許多的初學者總是將判斷條件寫成if(strcmp(str1,str2))這種寫法是絕對要避免的,因爲該函數的返回值爲0時,結果爲真(str1=str2),正好和我們平時的邏輯相反!
以上敘述的三個函數都是不受字符串的長度限制,在使用時一定要注意不要忽略可用的字符串的長度(避免字符串數組的越界訪問造成的內存覆蓋丟失等)

3.長受限的串操作函數

  • strncp(char *dest,const char *src,int n)

    該函數在複製時根據傳參時規定的長度複製字符串,如果src的長度小於n那麼數組將在未填充部分自動填充NUL來補全,但如果src的長度大於n那麼src只會有n個字符被複制,並且該字符串不會以NUL結尾

  • strncat(char *dest,const char *src,int n)

    該函數在連接時,如果連接之後字符串總長大於dest能容納的最大長度src函數不會停止而是將後面的連接上去,並且在連接完最後個字符之後添加上NUL

  • strncmp

    以上三個函數的功能和我們剛剛介紹過的strcpy,strcat,strcmp的功能主要的差別就是在長度的控制上

3.字符串查找函數

  • 查找一個字符

    我們常常使用strchrstrrchr來查找字符串裏某個字符的位置
    strchr找到該字符第一次出現在該串中的位置,並返回指向它的指針。
    strrchr找到該字符最後一次出現在該串中的位置,並返回指向它的指針。

  • 查找任意幾個字符

    strpbrk(char const *str,char const *group);
    值得注意的是:如果輸入了一個任意幾個字符其中第一個字符存在於字符串裏,但是後面的不存在它仍然會給你返回指向第一個字符的位置的指針~
    返回原串中第一次出現的目標串的任意字符的地址
    匹配任何一個字符

int main ( )
{
           char  *arr = "ABCD";
           char *ret = strpbrk( arr,"BF" );
           printf( "%c\n" , *ret );
           system( "pause" );
           return 0 ;
}
  • 查找子串strstr(const char *str,const char *str2)

    庫函數裏並沒有像strrstr這樣的函數,但我們可以自己實現它!該函數也是用於在字符串裏查找子串不和上面函數不一樣的是如果子串沒有完整的出現在原串裏它將返回NULL
拓展:實現strrstr 出現一次截斷一次

int main ( )
{
           char  *arr = "ABCD";
           char *ret = strstr( arr,"BF" );
           printf( "%c\n" , *ret );
           system( "pause" );
           return 0 ;
}

4.高級查找字符串

  • 查找一個字符串前綴

    strspn(const char *str,const char *group);
    
strcspn(const char *str,const char *group);
    group指定了一個或者多個字符。strspn返回str起始部分匹配group裏任意字符的字符數,如果str離包含空格和製表符那麼這個函數將返回str其實部分空白字符的數目
strcspn正好與之相反的計算了不匹配的字符數目一旦出現相等的就不統計了!!
下面的代碼將計算指向第一個非空白字符的指針的值:char *ptr=buffer+strspn(buffer,"\n\r\t\v");

  • 查找標記

    找到第一個標記並將它置成NULL 保存它的位置並且下次從上次保存的位置開始找下一個標記。

  • 提取表及


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章