---
# System prepended metadata

title: ASCII
tags: [FoShiShi]

---

###### tags: `FoShiShi`

# ASCII

## What

`ASCII`
全名`American Standard Code for Information Interchange`
中文名為美國標準資訊交換碼
是基於拉丁字母的一套電腦編碼系統

`ASCII`碼用了`0 ~ 127`個數字來儲存**大小寫英文字母，阿拉伯數字，...**

## When

在我們要去計算字元間的變換
例：
像在一個字串中把所有英文字母變成下一個(`A -> B`, `B -> C` ... `Z -> A`)
就**一定會用到`ASCII`來轉換字元**

## How

### ASCII表

![](https://i.imgur.com/plBbfV2.png)

:::info
看十進位對字符就可以了
十六進位不用看
:::

**第`0 ~ 31`跟`127`格的字元我們基本上不太會用到**
**剩下的就是真正會用到的部分**

我們會發現，`ASCII`很聰明的把連續的英文字母跟數字排在一起，這樣就**可以透過`ASCII`的加減實現英文字母的加減**

### 型態轉換

只要在一個字元的名稱**前面加上`(int)`就能夠將其轉為他的`ASCII`碼**
相反的，只要**在一個數字(`ASCII`表的範圍中)的名稱前面加上`(char)`就可以將其轉為字元**

例：
```cpp=
char chr = 'A';
cout << (int)chr << endl; // 65
int ascii = (int)(chr + 2);
cout << (char)ascii << endl; // C
```

## 實際應用

### 題目1

輸入一字串`str`
其中只包含大寫英文字母
將其每個字母變為下一個字母
(`A -> B`, `B -> C`, ... , `Z -> A`)
然後輸出

:::spoiler solution

可以依序把每個英文字母的`ASCII`減掉`41('A'的ASCII)`
這樣就會變成：
`A = 0, B = 1, ... , Z = 25`
這樣如果`Z`在`+1`後可以`% 26`變回`A`

```cpp=
#include<iostream>
using namespace std;

int main() {
    string str;
    cin >> str;
    for(int i = 0; i < str.length(); i ++ ) {
        int num = int(str[i]) - int('A');
        num = (num + 1) % 26;
        str[i] = char(int('A') + num);
    }
    cout << str << endl;
}
```
