咱們知道,c語言中的數據類型有short、int、long、char、float、double六種,可是沒有字符串類型,若是咱們要表達一串字符那麼應該怎麼作呢?
好比abc咱們能夠表示爲"abc",字符串能夠放入數組:數組
char arr1[] = "abc"; char arr2[] = { 'a','b','c' }; printf("arr1 = %s\n", arr1); printf("arr2 = %s\n", arr2);
可見,有兩種表示形式,那麼這兩種輸出的結果是否相同,且看:
可見arr2的結果除了abc還另外出現了燙燙燙...相似於亂碼的東西。緣由是,arr1中的"abc"---'a','b','c','\0',最後一個的\0是一個轉義字符,是字符串的結束標誌,其值是0,在計算字符串長度時\0是結束標誌,不能算字符串內容,而arr2中則沒有\0的表示。
修改一下代碼,給arr2加上'\0':ide
char arr1[] = "abc"; char arr2[] = { 'a','b','c','\0'}; printf("arr1 = %s\n", arr1); printf("arr2 = %s\n", arr2);
輸出結果徹底相同:
接下來打印一下arr2不加'\0'時的兩者的長度,看是否相同:code
char arr1[] = "abc"; char arr2[] = { 'a','b','c'}; printf("%d\n", strlen(arr1)); printf("%d\n", strlen(arr2));
輸出結果:
其中arr1的結果毋庸置疑,那麼arr2的結果爲何是15呢,緣由就是由於arr2沒有定義'\0',使得arr2的長度是一個隨機值 即arr2:a b c .......直到遇到\0。
若是再給arr2加上‘\0’:blog
char arr1[] = "abc"; char arr2[] = { 'a','b','c','\0'}; printf("%d\n", strlen(arr1)); printf("%d\n", strlen(arr2));
輸出結果:
長度也就徹底同樣了。字符串
有這麼一個路徑:c:\test\32\test.c,如今咱們要讓它在控制檯顯示出來,應該怎麼作呢?
直接使用雙引號括住:it
printf("%s\n", "c:\test\32\test.c");
(Note:c語言中%d打印整型, %c打印字符,%s打印字符串, %f打印浮點型數字==小數,%p以地址的形式打印, %x打印十六進制數字,%lf打印雙精度浮點數... )
結果以下:
可見,與咱們所須要的有很大的差異,緣由是‘\’使得‘\’+‘後面的字符’構成了一個轉義字符,即\t---水平製表符,\32---八進制數字32,咱們再來看一下這串內容的長度:table
printf("%d\n", strlen("c:\test\32\test.c"));
長度爲13,原本應該是17的,但倒是13,緣由就是由於‘\’+‘後面的字符’構成的轉義字符獨佔一位,即\t是一位,\32是一位,\t又是一位,如今再數一下,正好13位。
若是咱們想要完美的輸出c:\test\32\test.c這串字符的話,就須要在‘\’的前面再加上一個‘\’,防止其和其後面的字符被解釋爲一個轉義序列符,咱們修改一下代碼:class
printf("%s\n", "c:\\test\\32\\test.c");
輸出結果:
很完美,再看一下長度:test
printf("%d\n", strlen("c:\\test\\32\\test.c"));
輸出結果:
徹底正確,因此,咱們在輸出帶有‘\’的字符串時,須要在‘\’前再加上一個‘\’來防止被誤認爲是一個轉義字符而影響輸出結果。
常見的轉義字符:亂碼
轉義字符 | 意義 |
---|---|
\a | 警告字符 |
\b | 退格符 |
\f | 換頁 |
\r | 回車 |
\n | 換行符 |
\t | 水平製表符 |
\v | 垂直製表符 |
\' | 單引號 |
\" | 雙引號 |
\ | 反斜槓 |
\ddd | ddd表示1-3個八進制數字 |
\xdd | dd表示2個十六進制數字 |