從概念上講,c語言中沒有字串型別
在c語言中使用字元陣列來模擬字串
c語言中的字串是以『\0』結束的字元陣列
c語言中的字串可以分配於棧空間,堆空間或者唯讀儲存區
char s1 = ; //沒有『\0』,所以s1只不過是個單純的字元陣列
char s2 = ; //也是乙個字元陣列,但是最後乙個元素是『\0』,因此s2就成了c語言中的字串,並且這麼寫的話這個字串是在棧空間分配的
char* s3 = "hello"; //是c語言中最常規的寫字串的方法,這樣的字串儲存於唯讀儲存區,相當於乙個字串常量,不能改變裡面的內容
char* s4 = (char*)malloc(6*sizeof(char));
s4[0] = 'h';
s4[0] = 'e';
s4[0] = 'l';
s4[0] = 'l';
s4[0] = 'o';
s4[0] = '\0'; //malloc返回堆空間,因此s4指向的字串是在堆上分配的空間
free(s4);
在棧和堆上分配的字串都可以自由改動裡面的內容,但是在唯讀儲存區上字串裡的內容不可以改變
字串的長度
字串的長度就是字串所包含字元的個數
c語言中的字串長度指的是第乙個『\0』字元前出現的字元個數
c語言中通過『\0』結束符來確定字串的長度
例1:char g[100];
int main()
編譯執行得:
改為:char g[100];
int main()
編譯執行得:,結果不變,因為字串只算第乙個『\0』字元前面的所有字元,後面無論是什麼都不值字串的一部分了,但是後面的和前面的所有內容都是字元陣列的內容。
警告:
例2char* a = "123";
char* b = "1234";
if( strlen(a) >= strlen(b) ) //正常執行
if( strlen(a) - strlen(b) >= 0 ) //兩個無符號數相減總是大於等於0的,所以該if總是執行
strlen()的返回值是用無符號數定義的,因此相減不可能產生負數,以上的語句不等價
面試題:
size_t strlen(const char* s)
return length;
}使用一條語句實現strlen:
size_t strlen(const char* s)
return ( assert(s), ( *s ? (strlen(s+1) + 1) : 0 ));
} //逗號表示式先assert(),然後三目運算,採用遞迴實現求長度
注意:
一般情況下,千萬千萬不要自行編寫c標準庫已經提供的函式
標準庫有時會使用組合語言實現,目的就是為了充分利用機器所提供的特殊指令以追求最大速度
復用已經存在的函式庫會更高效
不受限制的字串函式
不受限制的字串函式是通過尋找字串的結束符'\0'來判斷長度,無需提供字串長度資訊
字串複製:char* strcpy(char* dst, const char* src);
字串連線:char* strcat(char* dst, const char* src);
字串比較:int strcmp(const char* s1, const char* s2);
注意:
不受限制的字串函式都是以'\0'作為結尾標記來進行的,因此輸入引數中必須包含'\0'。引數不能是字元陣列,否則會呼叫出錯。
strcpy和strcat必須要保證目標字元陣列的剩餘空間足以儲存整個源字串。
strcmp以0值表示兩個字串相等
.第乙個字串大於第二個字串的時候返回值大於0
.第乙個字串小於第二個字串的時候返回值小於0
strcmp不會修改引數值,但依然以'\0'作為結束符
面試題:
實現庫函式strcpy
char* strcpy(char* dst, const char* src)
char* ret = dst;
assert(dst && src);
while( (*dst++ = *src++) != '\0' );
return ret;
長度受限制的字串函式
長度受限制的字串函式接受乙個現實的長度引數用於限定操作的字元數
字串複製:char* strncpy(char* dst, const char* src, size_t len);
字串連線:char* strncat(char* dst, const char* src, size_t len);
字串比較:int strncmp(const char* s1, const char* s2, size_t len);
以後的工作當中,如果非要呼叫字串庫函式的話,一定要呼叫長度受限制的字串函式,一定要手工指定長度究竟是多少字元,因為這一組函式比長度不受限制的字串函式要安全的多。
注意:
strncpy只複製只複製len個字元到目標字串
.當源字串的長度小於len時,剩餘的空間以'\0'填充
.當源字串的長髮大於len時,只有len個字元會被複製,且它將不會以'\0'結束
strncat最多從源字串中複製len個字元到目標字串中
.strncat總是在結果字串中後面新增'\0'
.strncat不會用'\0'填充目標串中的剩餘空間
strncmp只是比較len個字元是否相等
.相等返回0,大於返回值大於0,小於返回值小於0
c語言中的字串
一 c語言中的字串 c語言中沒有字串型別 字串實際就是多個字元連在一起,所有可以用字元陣列來存放字串。但是使用字元陣列輸出時需要使用for迴圈 例如 這樣使用十分不方便,有沒有一種簡約的方式,讓我們一下子就能輸出呢?有但是需要改兩個地方!1.長度要 1 2.末尾要加乙個 0 然後用 s 格式化控制符...
C語言中的字串
1.標準函式gets與puts分別用於字串的整體輸入和輸出,且gets接收字串時,字串中可包含空格。使用格式為 gets 字元陣列 或者puts 字元陣列 由標頭檔案stdio.h支援 2.常用字串處理函式 由標頭檔案string.h strlen 測試字串長度的函式,函式返回值為字串的實際長度 s...
C語言中的字串
c語言中沒有字串這種型別,只能通過字元陣列來模擬字串 c風格的字串是以零結尾的字串 char str1 100 指定了長度,那麼剩下的部分補充為0 不指定長度 char str2 char str3 通過字串初始化字元陣列 並且追加 0 char str4 abcd char str5 4 abcd...