10.1字符串
10.1-1字符串
字符數組
char word[] = {‘H’,‘e’,‘l’,‘l’,‘o’,‘!’};
word[0] | H |
---|---|
word[1] | e |
word[2] | l |
word[3] | l |
word[4] | o |
word[5] | ! |
這不是C語言的字符串,因為不能用字符串的方式做計算
字符串
char word[] = {‘H’,‘e’,‘l’,‘l’,‘o’,‘!’};
word[0] | H |
---|---|
word[1] | e |
word[2] | l |
word[3] | l |
word[4] | o |
word[5] | ! |
word[6] | \0 |
字符串
- 以0(整數0)結尾的一串字符
- 0或‘\0’是一樣的,但是和‘0’不同
- 0標志字符串的結束,但它不是字符串的一部分
- 計算字符串長度的時候不包含這個0
- 字符串以數組的形式存在,以數組或指針的形式訪問
- 更多的是以指針的形式
- sring.h里有很多處理字符串的函數
字符串變量
以下是存儲字符串的方式 - char *str = “Hello”;
- char word[] = “Hello”;
- char line[10] = “Hello”;
字符串常量 - “Hello”
- “Hello”會被編譯器變成一個字符數組放在某處,這個數組的長度是6,結尾還有表示結束的0
- 兩個相鄰的字符串常量會被自動連接起來
- 行末的\表示下一行還是這個字符串常量
字符串 - C語言的字符串是以字符數組的形態存在的
- 不能用運算符對字符串做運算
- 通過數組的方式可以遍歷字符串
- 唯一特殊的地方是字符串字面量可以用來初始化字符數組
- 以及標準庫提供了一系列字符串函數
# include <stdio.h>int main()
{char a[]="Hello";printf("%s",a);
}
10.1-2字符串常量
字符串常量
char* s = “Hello,world”;
- s 是一個指針,初始化為指向一個字符串常量
- 由于這個常量所在的地方,所以實際上s是const char* s,但是由于歷史的原因,編譯器接受不帶const的寫法
- 但是試圖對s所指的字符串做寫入會導致嚴重的后果
- 如果需要修改字符串,應該用數組:
- char s[] = “Hello,world!”;
指針還是數組? - char *str = “Hello”;
- cahr world[] = “Hello”;
- 數組:表示這個字符串在這里
- 作為本地變量空間自動被回收
- 指針:這個字符串不知道在哪里
- 處理參數
- 動態內存分配
注意:如果要構造一個字符串–>數組
如果要處理一個字符串–>指針
char*是字符串? - 字符串可以表達為char*的形式
- char*不一定是字符串
- 本意是指向字符的指針,可能指向的是字符數組(就像int*一樣)
- 只有它所指的字符數組有結尾的0,才能說它所指的是字符串
10.1-3字符串輸入輸出
字符串賦值?
- char *t = “title”;
- char *s;
- s=t;
- 并沒有產生新的字符串,只是讓指針s指向了t所指的字符串,對s的任何操作就是對t做的
字符串輸入輸出 - char string[8];
- scanf(“%s”,string);
- printf(“%s”,string);
- scanf讀入一個單詞(到空格,tab或回車為止)
- scanf是不安全的,因為不知道要讀入的內容的長度
安全的輸入
char string[8];
scanf(“%7s”,string);
在%和s之間的數字表示最多允許讀入的字符串的數量,這個數字應該比數組的大小小一
常見錯誤 - cahr *string;
- scanf(“%s”,string);
- 以為char*是字符串類型,定義了一個字符串類型的變量string就可以直接使用了
- 由于沒有對string初始化為0,所以不一定每次運行都沒錯
空字符串 - char buffer[100]=“”;
- 這是一個空的字符串,buffer[0] == ‘\0’
- char buffer = “”;
- 這個數組的長度只有1!
10.2字符串函數
10.2-1單字符輸入輸出,用putcher和getcher
putcahr
- int putchar(int c);
- 向標準輸出寫一個字符
- 返回寫了幾個字符,EOF(-1)表示寫失敗
getchar - int getchar(viod);
- 從標準輸入讀取一個字符
- 返回類型是int是為了返回EOF(-1)
- Windows–>Ctrl-Z
- Unis–>Ctrl-D
10.2-2字符串函數strlen
標準庫中的字符串函數
string.h
- strlen
- strcmp
- strcpy
- strcat
- strchr
- strstr
strlen - size_t strlen(const cahr *s)
- 返回s的字符串長度(不包括結尾的0)
#include <stdio.h>
#include <string.h>int main()
{char a[]="Hello";printf("%s\n",a);printf("%lu",strlen(a));
}
以下是是通過自己寫的函數邏輯實現strlen的功能
#include <stdio.h>
#include <string.h>int strlen1(