紅塵**網 wap.zuxs.net
c語言中沒有string基本資料型別
c語言裡有這個標頭檔案,所以就想當然的認為c語言裡有string這個型別,通過下面這種形式來宣告string的變數
string astring;
編譯失敗。原來c語言裡壓根就沒有string這個型別,所以字串都是通過char陣列來儲存的, 而這個標頭檔案裡宣告的函式原型也全是針對char陣列的種種操作。直到c++中才出現了string這個類(注意是類, 不是型別)。
字串通過字元陣列來定義時,缺省會在陣列最後乙個元素加上'\0'作為結束標誌
鑑於第二點,如果要區分普通的字元陣列和字串,參考如下**
//此string1後面不會有'\0'標誌,就是一般的字元陣列
char string1[3]=;
//string2為字串形式,結尾有\0標誌,長度為4
char string2[4]="abc"
注意:這裡的string2的長度可以不限定,預設省略,交給編譯器自動設定長度,如果需要人為設定長度,則需要考慮到'\0'字元陣列名字和指標的關係如果字元陣列長度不夠,則編譯器報錯
d:\otherworkspace\devcppworkspace\ds\ds-c2\demo5.cpp [error] initializer-string for array of chars is too long [-fpermissive]
示例**如下:
#includeint main()
return 0;
}
列印結果
000000000062fe10 000000000062fe10 a
000000000062fe11 000000000062fe11 b
000000000062fe12 000000000062fe12 c
000000000062fe13 000000000062fe13
根據**的執行結果來看,string【也就是陣列名字】其實就是乙個指標,它指向了第1個元素【下標為0】,我們可以直接對指標進行算數運算,它會自動的根據指標型別移動相應的長度,比如說這裡的指標就是字元型,佔乙個位元組,那麼string++,就會自動把指標往後移動乙個位元組。
#include int main()
執行結果:
enter name: dennis ritchie
your name is dennis.
scanf()
函式讀取字串行,當遇到空格(space,newline,tab etc.)時停止讀取。
那麼如何讀取行呢?
#include int main()
輸出
enter name: tom hanks
name: tom hanks
在這裡,我們使用了fgets()函式從終端讀取字串。 fgets(name,sizeof(name),stdin); sizeof(name)的結果為30。因此,我們最多可以輸入30個字元作為輸入,即name字串的大小,也可以指定為其它的長度。 為了列印字串,我們使用了puts(name),你也可以直接使用printf()函式列印。
注意:gets()函式也可以接受使用者的輸入。但是,它已從c標準中刪除。 這是因為gets()允許輸入任意長度的字元。因此,可能存在緩衝區溢位。示例**
//求字串長度
#include #include int main(void)
output
without null character: 45
with null character: 46
指標和字串之間的聯絡
c語言中沒有string基本資料型別 c語言裡有這個標頭檔案,所以就想當然的認為c語言裡有string這個型別,通過下面這種形式來宣告string的變數string astring 編譯失敗。原來c語言裡壓根就沒有string這個型別,所以字串都是通過char陣列來儲存的,而這個標頭檔案裡宣告的函式...
C 陣列 字串 指標之間聯絡詳解
1 定義 儲存多個同型別的值。int a 5 是int陣列,而不是陣列 5 整型常數 const值 變數 常量表示式 const int n 5 char a n cout a 2 初始化 定義陣列時,才能初始化。兩種方式 列表 對於字串可以不用 下標賦值 列表 int a 10 字元 char a...
指標 陣列 字串 結構體之間的聯絡
1 指標操作變數 int p 定義乙個整形指標 p代表的是位址,p代表的是位址指向的值 int a 10 p a 將a的位址賦值給p指標 pa 20 通過指標改變變數a的值 a 20 也可以通過變數改變 p的值 2 指標運算元組 int i,b 30,a 0 i int p a 陣列名代表陣列的首位...