字串是一種非常重要的資料型別,但是c語言不存在顯式的字串型別,c語言中的字串都以字串常量的形式出現或儲存在字元陣列中。同時,c 語言提供了一系列庫函式來對操作字串,這些庫函式都包含在標頭檔案 string.h 中。1.1、什麼是字串常量
c 語言雖然沒有字串型別,但是 c語言提是存在字串這個概念的,也就是字串常量:以 nul 位元組結尾的 0 個或多個字元組成的序列。字串常量是不可被修改的,一般用一對雙引號(" ")括起的一串字元來表示字串常量,如:
"hello!"、"\awarning!\a"、"123abc\n"、""
字串常量可以為空,如""就是乙個空的字串常量,但是即使為空,還是存在乙個終止符 nul 的。(在 c 語言中,常用轉義字元 \0 來表示 nul)
1.2、字串常量與指標
字串常量與指標關係密切,因為字串常量的值,實際上表示的是儲存這些字元的記憶體空間的位址,更準確地說是字串常量中第 1 個字元的位址,而不是這些字元本身。因此,在 c 語言中是不能直接進行字串賦值的(因為沒有字串型別嘛)。在 c 語言中,常通過宣告乙個指向 char 型別的指標並將其初始化為乙個字串常量的方式來訪問乙個字串:
char *message = "hello world!";
// 上面的語句也可以拆分成下面兩句
char *message;
message = "hello world!"; // 這句話看起來像是字串複製,其實不是,只是涉及到指標操作
#include
int main()
printf("\n");
return 0;
}/* output:
* hello world!
* h e l l o w o r l d !
*/
這段**,使用字元指標遍歷了字串常量中的每乙個字元。
1.3、字元陣列
用於存放字元的陣列稱為字元陣列。在 c 語言中,除了字串常量外,其他所有字串都必須儲存於字元陣列或動態分配的記憶體中。定義乙個字元陣列和定義乙個普通陣列一樣,不同的是字元陣列中存放的是字元資料而已:
char chararray = ; // 宣告並初始化乙個字元陣列
這句話定義並初始化了乙個字元陣列 chararray。這個陣列的長度實際上為 6 ,因為會自動新增乙個字串結束符 '\0'。
c 語言提供了一種更簡潔的方法來對字元陣列進行初始化:
char chararray = "hello world!"; // 宣告並初始化乙個字元陣列
上述兩種宣告方式等價。
可以對乙個字元陣列做出修改:
#include
#include
int main()
}printf("%s\n",str);
}
這段**可以將字元陣列中的小寫字母轉換成大寫字母後輸出。
1.4、 字串常量與字元陣列的區別
1)字串常量是乙個字元陣列,但是內容和長度在初始化時就已經固定了,不可更改;可以通過乙個指向字串常量第乙個元素的指標來訪問該字串常量;
2)字元陣列是乙個用於存放字元的陣列,字元陣列的值是可以更改的。
字串的長度就是這個字串所包含字元的個數,但是這個長度是不包含 nul 字元的。c 語言中使用庫函式 strlen 來計算字串長度:
size_t strlen(char const *string);
需要注意的是 strlen 的返回值型別:size_t 型別,這是乙個無符號整數型別。
#include
#include
#include
int main()
/* output:
* 12
*/
c 語言中使用庫函式 strcpy 來進行字串複製操作:
char *strcpy(char *dst , char const *src);
函式 strcpy 接收兩個字串引數,並將引數 src 字串複製到 dst 引數。使用 strcpy 函式時需要注意的是,必須保證目標字元陣列 dst 的長度足夠存放源字元陣列 src 的內容。如果 src 比 dst 長,則 src 剩餘部分的字元仍會被複製,而且它們會覆蓋 dst 後面的記憶體空間的值,如果這除記憶體空間原本就存放有值,則會導致原本的資料丟失,這樣會造成很嚴重的後果。為了解決這個問題, c 語言中提供了一種更為安全的方式來進行字串複製操作——strncpy 函式:
char *strncpy(char *dst , char const *src , size_t len);
strncpy 函式有三個引數,與 strcpy 函式一樣,它也是將 src 字串中的字元複製到目標陣列 dst 中去,但是 strncpy 函式提供的第三個引數 len 規定了可以向 dst 中寫入的字元的個數:
1)如果 strlen(src) > len,則只有 len 個字元被複製到 dst 中去,此時 dst 將不會以 nul 位元組結尾(也就是說,strncpy 呼叫的結果可能不是乙個字串);
2)如果 strlen(src) < len,則 src 中的字元全被複製到 dst 中去,dst 中剩餘的部分用 nul 填充。
c 語言中使用庫函式 strcat 來連線兩個字串:
char *strcat(char *dst,char const *src);
函式 strcat 將引數 src 字串連線到引數 dst 字串的後面。與 strcpy 函式乙個同樣的問題是,必須保證 dst 的剩餘空間足夠存放下 src 整個字串。c 語言中提供了 strncat 函式來解決這個問題:
char *strncat(char *dst , char const *src , size_t len);
strncat 函式從 src 中最多複製 len 個字元到目標陣列 dst 後面,並且,strncat 總是在結果字串後面新增乙個 nul 位元組,而且不會像 strncpy 函式那樣對 dst 剩餘的空間用 nul 進行填充。
c 語言中使用庫函式 strcmp 來進行字串比較。strcmp 函式會對被比較的兩個字串進行逐字元地比較,直到發現不匹配為止:最先不匹配的字元中較小的那個字元所對應的字串即被認為小於另乙個字串;如果兩者所有字元都匹配,則認為這兩個字串相等;
int strcmp(char const *s1 , char sonst *s2);
該函式的返回值如下:1)s1 小於 s2,返回乙個負值;
2)s1 等於 s2,返回 0;
3)s1 大於 s2,返回乙個正值。
char *strncmp(char const *s1 , char const *s2 , size_t len);
可以使用 strncmp 函式限定比較的字元的個數,返回值與 strcmp 一樣,但是只針對前 len 個字元進行比較。
6.1 查詢乙個字元
可以使用 strchr 函式或 strrchr 函式來在乙個字串中查詢乙個特定的字元:
char *strchr(char const *str,int ch); // int ch 是字元的ascii碼值
char *strrchr(char const *str,int ch);
函式 strchr 在字串 str 中查詢字元 ch 第一次出現的位置,並返回乙個指向該位置的指標;如果沒有找到相應的字元,則返回乙個 null 指標。函式 strrchr 在字串中查詢字元 ch 最後一次出現的位置,並返回指向該位置的指標。
6.2 查詢任意幾個字元
可以使用 strpbrk 函式來查詢任何一組字元第一次在字串**現的位置:
char *strpbrk(char const *str , char const *group);
這個函式返回乙個指向字串 str 中第乙個匹配 group 中任何乙個字元的字元位置,如果沒有匹配到,則返回乙個 null 指標。
6.3 查詢乙個子串
可以使用 strstr 函式來在乙個字串中查詢乙個子串:
char *strstr(char const *str1 , char const *str2);
這個函式在 str1 中查詢整個字串 str2 第一次出現的起始位置,並返回乙個指向該位置的指標;如果 str2 並沒有完整的出現在 str1 中,則函式將返回乙個 null 指標;如果 str2 是乙個空字串,則返回str1.
《c和指標》
《c程式語言 第二版》
C語言 氣泡排序排序多個字串
strcmp函式 原型 extern int strcmp const char s1,const char s2 用法 include 功能 比較字串s1和s2。一般形式 strcmp 字串1,字串2 說明 當s1s2時,返回值 0 即 兩個字串自左向右逐個字元相比 按ascii值大小相比較 直到...
c語言如何輸入多個字串 C語言動態接收多個字串
1.背景與基本原理在一些場合下,使用者往往需要動態輸入字串,如果程式能夠自動接收傳進的字串並進行計數,便可以達到動態接收的效果。基本原理是定義乙個指向字串指標的指標,對其進行進一步細化。我們期待程式能夠接收未知數量 未知長度的字串,能夠動態儲存字串。如圖1所示,設計乙個這樣的結構便可以達成以上要去。...
多個字串拼接倒敘排序
一點一點成長一點點的記錄都是以後的回憶也是自己從乙個菜鳥成長為大神的乙個過程 long a 12 string b string.valueof a long型別轉換為字串型別 int rand random.nextint 10 string nonce string valueof rand i...