# 字元字串
## 字元
### 如何宣告?
```c
char c;
```
---
### 初始化
```c
char c='A';
```
---
### ASCII

列幾個重點:
* 'A'=65
* 'Z'=90
* 'a'=97
* 'z'=122
* '0'=48
* '9'=57
---
### 好用字元函式
要引入<cctype.h>函式庫
| 函示 | 用處 |
|:-------------- |:------------------------------------- |
| isalnum(字元) | 字元是否為字母或數字 :star: |
| isalpha(字元) | 字元是否為字母 :star: |
| isblank(字元) | 字元是否為白空白 :star: |
| iscntrl(字元) | 字元是否為控制字元 (function ) |
| isdigit(字元) | 字元是否為數字 (function ) :star: |
| isgraph(字元) | 字元是否有形狀 (function ) |
| islower(字元) | 字元是否為小寫字母 (function ) :star: |
| isprint(字元) | 字元是否為可列印 |
| ispunct(字元) | 字元是否為標點符號 :star: |
| isspace(字元) | 字元是否為空白/Tab |
| isupper(字元) | 字元是否為大寫字母 :star: |
| isxdigit(字元) | 字元是否為16進位數字 |
---
## 字串
### 宣告
字串是由字元組合而成的。
字串要用字元陣列來宣告
```
char 變數名稱[陣列大小]
```
舉例:
```c
char c[256];
```
---
### 初始化
```c
char c[256]="Hello world"
```
| c[0] | c[1] | c[2] | c[3] | c[4] | c[5] | c[6] | c[7] | c[8] | c[9] | c[10] | c[11] |
|:----:|:----:|:----:|:----:|:----:|:---- |:----:|:----:|:----:|:----:|:-----:|:-----:|
| 'H' | 'e' | 'l' | 'l' | 'o' | ' ' | 'w' | 'o' | 'r' | 'l' | 'd' | '\0' |
字串的最後一格都是用'\0'代表結束。
---
如果要輸入中文字
```c
char c[256]="林佳龍"
```
:::info
記得:
字元要加`' '`
字串要加`" "`
:::
---
### 字串輸入與輸出
輸入用%s輸入。
舉例:
```c
int main(){
char name[20];
scanf("%s",name)
printf("%s",name);
return 0;
}
```
輸入
```
Hello
```
輸出:
```
Hello
```
---
如果要讀入的有空白怎麼辦?
就要使用gets()函示
```
gets(字串名稱(指標));
```
stdin標準輸入,也可以說是從鍵盤讀取的概念。
舉例:
```c=
#include <stdio.h>
int main(){
char name[20];
gets(name);
printf("%s",name);
return 0;
}
```
輸入:
```
Hello world
```
輸出:
```
Hello world
```
---
依序輸出字串的每一個字元。
用for迴圈走遍全部的字串
```c=
#include <stdio.h>
int main(){
char name[20];
fgets(name, 20, stdin);
for(int i=0;i<20;i++){
printf("%c",name[i]);
}
return 0;
}
```
輸出特定字元
```c=
#include <stdio.h>
int main(){
char name[20];
fgets(name, 20, stdin);
for(int i=0;i<20;i++){
if(name[i]=='o'){
printf("%d %c\n",i,name[i]);
}
}
return 0;
}
```
輸入:
```
Hello world
```
輸出:
```
4 o
7 o
```
---
## 字串好用函式
要引入<[string.h](https://zh.wikipedia.org/zh-tw/String.h)>函式庫
### strlen()
```c
strlen(字串名稱(指標))
```
回傳字串的長度
舉例:
```c=
#include <stdio.h>
#include <string.h>
int main(){
char name[20];
scanf("%s",name);
printf("%d",strlen(name));
return 0;
}
```
輸入:
```
chisc
```
輸出:
```
5
```
---
### memset()
```
memset(字串名稱(指標),要覆蓋的字元,要覆蓋的長度);
```
將字串的內的一部分位置換成你要求的字元
舉例:
```c=
#include <stdio.h>
#include <string.h>
int main(){
char name[50]="Hello everyone";
printf("%s\n",name);
memset(name,'$',9);
printf("%s",name);
return 0;
}
```
輸出:
```
Hello everyone
$$$$$$$$$ryone
```
---
### strcpy()
```
1.strcpy(字串a名稱, 字串b名稱);
2.strcpy(字串a名稱,要複製的字);
```
將b字串的內容複製到a字串。
舉例:
```c=
#include <stdio.h>
#include <string.h>
int main (){
char str1[]="Sample string";
char str2[40];
char str3[40];
strcpy(str2,str1);
strcpy(str3,"copy successful");
printf("str1: %s\n str2: %s\n str3: %s\n",str1,str2,str3);
return 0;
}
```
---
要引入 <[stdlib.h](https://zh.wikipedia.org/wiki/Stdlib.h)> 函式
### atoi()
```
atoi("字串名稱");
```
將字串轉成int
舉例:
```c=
#include <stdio.h>
#include <stdlib.h>
int main (){
char str1[]="111";
int a;
a=atoi(str1);
printf("%d",a);
return 0;
}
```
###### tags: `中和高中`