[C] 每天來點字串用法(基本篇) - skyblog
文章推薦指數: 80 %
而對於字元指標的宣告,C 有一個特別的地方,他可以直接讓字元指標類的字串有初始值: char *s4 = "hello world";. 像s4 這種情況,是由編譯器在唯 ...
字串的基本使用
關於'\0'字元
輸入字元陣列
[C]每天來點字串用法(基本篇)
Sky
2021-02-25
有感於C的字元陣列實在有夠難(只是你廢),所以決定每天搞懂一點關於它的性質或用法之類的,希望我能夠持之以恆。
(2018的我)
不,你不行。
(2021的我)
字串的基本使用首先,C的字串指的其實是字元陣列,而字元陣列的使用通常有以下幾種:
chars1[128]="helloworld";
chars2[]="helloworld";
另外,許多函式都會使用字元指標來操作字串:
char*s3=s1;//相當於char*s3=&s1[0]
而對於字元指標的宣告,C有一個特別的地方,他可以直接讓字元指標類的字串有初始值:
char*s4="helloworld";
像s4這種情況,是由編譯器在唯讀記憶體中放入"helloworld"這個字元陣列,再讓s4這個指標指向它。
因為是唯讀的記憶體,所以我們不能更改這個字串的內容,但可以更改s4指向的位址。
接著讓我們看看字串的輸出:
chars1[128]="helloworld";
printf("%s\n",s1);//helloworld
chars2[]="helloworld";
printf("%s\n",s2);//helloworld
char*s3=s1;
printf("%s\n",s3);//helloworld
char*s4="helloworld";
printf("%s\n",s4);//helloworld
關於'\0'字元說到C的字串,絕對不能不提到\0這個字元,不要看它有兩個字(\和0),其實它是一個單一的字元,就像換行字元\n一樣。
他的功用是:標記出字串的結束。
看到我們上面輸出中的s1字串,我們明明就宣告了128個空間,但為什麼輸出結果只有11個字元?剩下的去哪了呢?正是被\0擋掉了。
\0明確的告訴程式:在我後面的都是垃圾,不要用,因此我們才能正確的輸出。
但是,我們在初始化的時候並沒有把\0寫出來啊?其實是編譯器會幫我們在字串結尾補上\0,所以基本上我們不用擔心忘記加上\0就會世界毀滅之類的(並不會。
另外,\0的ASCII值正好是0。
我們可以利用sizeof來驗證'\0'的存在:
charstr[]="helloworld";
printf("%d\n",sizeofstr);//12
可以看到,str本身只有11個字元,但是佔用的空間是12個byte,證實了有一個看不到的字元被放入了str。
輸入字元陣列如果要輸入字串的話,有以下幾種方法:
chars1[48];
scanf("%s",s1);
printf("%s\n",s1);
chars2[48];
char*s3=s2;//相當於s3=&s2[0];
scanf("%s",s3);
printf("%s\n",s3);
這裡要注意的有幾點:首先是輸入只有兩種選擇,至於為什麼,多看一下應該很容易理解;另外就是在對字串使用scanf()時,後面的引數不用加&,原因是:
s1代表s1[0]的位址
因為s3指向s2[0],所以s3本身儲存了s2[0]的位址
最後要注意的是:scanf()讀字串時遇到空格就會斷開,而如果有剩下的部分,會被留在緩衝區裡等待下一次的scanf()。
另外,scanf()也會在讀入的字串後補上\0。
如果想要連同空格一起吃入字串的話,可以這麼寫:
charstr[128];
fgets(str,128,stdin);
上述範例中的fgets()原本是要從檔案指標中讀取一行字串時使用的函式,一行指的是遇到\n或EOF,讀取完後,會將\n(如果有遇到)和\0放入字串尾。
把str傳入第一個參數,就能把讀取結果存入str內,這裡在它的第三個參數傳入了stdin,這是標準輸入(通常是鍵盤)的指標,讓我們可以獲取鍵盤輸入的資料。
而第二個參數控制的是讀取進來的字元數(包含\0),不能超過這個值。
C
C-字串
NextPost
[C]每天來點字串用法(1)-strlen
PrevPost
[Python3.6]初探f-string
Alttext
天ほし
Category
C
All
字串
C++
Python
All
StructuralPatternMatching
演算法
All
搜尋
歌詞翻譯
All
日文
日常
All
短談
Test
ContactMe
GitHub
延伸文章資訊
- 1[C] 每天來點字串用法(基本篇) - skyblog
而對於字元指標的宣告,C 有一個特別的地方,他可以直接讓字元指標類的字串有初始值: char *s4 = "hello world";. 像s4 這種情況,是由編譯器在唯 ...
- 2(原創) char s[]字串和char *s字串有什麼差別? (C/C++) (C)
C語言有兩種字串宣告方式char s[]和char *s,兩者有什麼差異呢? ... 狀況下用法相同,但char *s速度略快,因為不需copy的動作,且*s++為C語言常用的 ...
- 3C++ char数据类型(详解版) - C语言中文网
最简单的字符数据类型是char 数据类型。 ... 以下示例即声明了一个名为letter 的char 变量。 ... 下面的程序显示了 \n 作为字符常数的用法,用单引号括起来:.
- 4C語言中char*和char[]用法區別分析 - 程式人生
C語言中char*和char[]用法區別分析. 阿新• • 發佈:2019-01-10. 本文例項分析了C語言中char* 和char []的區別。分享給大家供大家參考之用。具體分析如下:.
- 5C++ string char[] char* 用法说明_kidults的博客 - CSDN博客
char * 和char [ ] 的区别char a[5] :编译器会给数组a分配5个单元,每个单元的数据类型为字符char *s : 这是个指针变量,只占四个字节, ...