c語言中的c風格字串常有以下兩種儲存方式,做乙個總結,希望以後不需要再出現模稜兩可。
char陣列
如果是char str[5]= ,這存的就是乙個字元陣列,而不是乙個字串
如果是char str[6]= 這寸的就是乙個字串 為「abcde」 (c風格的字串),要留出乙個空間儲存\0表示字串終止,等價於如下定義方式:
char str[6] = 「abcde」
可以看出c風格的字串 如果是用陣列方式定義的,就要在字串長度的基礎上 + 1用來儲存\0,
char 指標
還有一種可以儲存字串的方式就是使用char型別的指標,比如
char *str = 「abcde」
這種方式要注意,str儲存的並不是字串的內容,而是字串的起始位址,在visual studio 的debug模式下,能看到str的值通常為位址+ 字串內容比如**0x7fffffffeffc 「abcde」**表示str指向的位址,(也就是字元a的位址)也就是str指標的值是0x7fffffffeffc,以這個位址為起始位址的字串的值是「abcde」
當使用printf()輸出時,格式化時選擇%s,會輸出abcde,這是printf遇到結尾符號『\0』即停止顯示列印。
所以在使用char 型別的指標儲存字串的時候會發生很多意想不到的錯誤及問題,這就是c語言中指標讓人頭疼的地方。
與字串有關的輸入輸出函式
以下說的所有字串都是用陣列儲存的
scanf
scanf輸入乙個字串而且是遇見空格就會停,比如輸入「hello world」之後,他只會讀入hello。要使用scanf("%s%s",str1,str2),才能讀入hello 和world,而且hello存在str1中,world存在str2中。
scanf("%s",str);是沒有取位址符號的,而且系統會自動在str最後補上\0
while(scanf("%s",str) != 1) 作用是持續讀入資料 在讀不到資料的時候停止迴圈
gets,puts
gets(str)就是從游標開始的地方讀到換行符,和scanf的區別就是空格也能被讀入,只有輸入回車才會停止讀入
puts(str)就是輸出乙個字串和乙個換行符,等價於printf("%s\n",str);
cin>>str1>>str2
這個也可以直接讀入兩個字串
其他函式
strcat(s1,s2) 將字串s2連線到s1之後
strcpy(s1,s2) 將字串2複製到字串1,返回字串1的值。
strcmp(s1,s2) 比較字串1和字串2的大小。如果1 > 2 返回正數,如果兩字串完全相等返回0,如果1< 2返回負數
strlen(s1)計算字串的長度,而且不把\0算進去
strlwr(str) 將字串全部轉化為小寫
strupr(str),將字串全部轉化為大寫。
使用上述函式 如果是在c語言中要包含string.h標頭檔案,如果是在c++中要包含cstring,也可以包含string.h標頭檔案,兩者區別在於cstring是對string.h標頭檔案進行了一些修改讓它更能相容c++罷了
c字串的儲存問題
程式的記憶體分配基礎,看我的另一篇部落格
c字串一般放在常量區,data段上.而且陣列方式儲存和指標方式有著很大區別。
看下面這個例子
int a = 0; 全域性初始化區
char *p1; 全域性未初始化區
main()
一定注意:陣列s儲存的內容是在執行的時候賦值的,但是指標p3指向的常量區中的字串內容是編譯時就賦值的。 C語言中的字串
從概念上講,c語言中沒有字串型別 在c語言中使用字元陣列來模擬字串 c語言中的字串是以 0 結束的字元陣列 c語言中的字串可以分配於棧空間,堆空間或者唯讀儲存區 char s1 沒有 0 所以s1只不過是個單純的字元陣列 char s2 也是乙個字元陣列,但是最後乙個元素是 0 因此s2就成了c語言...
c語言中的字串
一 c語言中的字串 c語言中沒有字串型別 字串實際就是多個字元連在一起,所有可以用字元陣列來存放字串。但是使用字元陣列輸出時需要使用for迴圈 例如 這樣使用十分不方便,有沒有一種簡約的方式,讓我們一下子就能輸出呢?有但是需要改兩個地方!1.長度要 1 2.末尾要加乙個 0 然後用 s 格式化控制符...
C語言中的字串
1.標準函式gets與puts分別用於字串的整體輸入和輸出,且gets接收字串時,字串中可包含空格。使用格式為 gets 字元陣列 或者puts 字元陣列 由標頭檔案stdio.h支援 2.常用字串處理函式 由標頭檔案string.h strlen 測試字串長度的函式,函式返回值為字串的實際長度 s...