iT邦幫忙

0

【從零開始的 C 語言筆記】第七篇-格式指定字 & 特殊字元

不怎麼重要的前言

上一篇我們介紹了什麼是變數,也結合了資料型態來讓大家了解,接下來大家有沒有想過,如果遇到需要讓使用者輸入資料來處理,並輸出對應結果時要怎麼辦呢?

接下來我們來結合變數,儲存輸入並輸出資料內容吧!


需要輸出變數、或用變數儲存輸入時怎麼辦?

在前面我們有提到過資料是有不同形態(字元、整數、浮點數等等的)的,而我們會用不同資料型態的變數來儲存這個資料,但如果今天我們要把變數輸出或讀取輸入儲存到變數裡時,要怎麼做處理才能讓電腦知道這個被輸入或輸出的資料,要以什麼樣的格式輸出、要以什麼樣的型態儲存?

這時候我們就會用到c語言中的一個語法--格式指定字,格式指定字聽起來好像很複雜,但其實就是代替變數本身來表示整體輸入輸出格式的存在。

在c語言中我們第一個接觸到的輸出code就是「printf("Hello World!\n");」,其中「""」包含的東西我們會稱他為字串,但是當我們需要輸出的字串包含變數時,這時我們就會使用格式指定字,如以下:

#include <stdio.h>

int main(){
    int a = 3;
    printf("your data: %d\n", a);

    return 0;
}

輸出字串中的「%d」就是代替變數a的格式指令字,你可以把它當成變數在字串中的替代詞,接下來我們將會介紹格式指令字有哪些。


格式指令字

我們先來複習一下前面第五篇的基本資料型態表吧:

類別 所佔記憶體(bytes) 存什麼樣的資料 格式指定字
char 1 字元,舉凡a~z/0~9/單一符號(+-/*%$#@等) %c
int 4 整數,數字範圍從-2147483648~2147483647 %d
float 4 單精確度浮點數,即小數 %f
double 8 雙精確度浮點數,即小數 %f

我們可以從上面的表先簡略的知道,基本的資料型態大概可以用這些格式指定字來表示,若只是讀取使用者輸入時用以上的格式指定字基本上就夠了,但其實還有更多的格式指定字,且有時候若要輸出資料內容時有其他指定格式,這些便不足以應付了。

所以以下我們會詳細整理格式指令字:

  1. 整數
指令字 說明
%d.%i 十進制有號整數
%u 十進制無號整數
%o 八進制有號整數
%x.%X 十六進制有號整數
%ld 十進制long int
%lld 十進制long long int

(備註:有號(signed)、無號(unsigned),可以參考第五篇,不過無號相對較少使用)

  1. 浮點數
指令字 說明
%f 以小數形式輸出浮點數(Ex. 輸出12.345時為「12.345000」)
%e 以科學記號形式輸出浮點數(Ex. 輸出12.345時為「1.234500e+001」)
%E 以科學記號形式輸出浮點數(Ex. 輸出12.345時為「1.234500E+001」)
%g 依情況使用%f或%e(Ex. 輸出0.345時為「0.345」、輸出0.0000345時為「3.45e-005」)

(雖然一般來說不會使用,但%g的輸出判斷可以參考這個連結)

  1. 字元、字串
指令字 說明
%c 字元(是單一的字元)
%s.%S 字串(是多個字元)
  1. 其他
指令字 說明
%p 輸出指標
%% 用於輸出時輸出「%」
%* 是忽略符號,應用如%*d、%*c、%*s,會讓程式忽略、丟棄這個資料
%數字 是設定資料寬度的用法,多用於輸出,應用如%10d.%15s
%-數字 是設定置左的用法,同時也設定資料寬度,多用於輸出,應用如%-10d.%-15s
%[] 用於輸出時只讀取「[]」內的字元,遇到非其內字元會停止讀取,應用如%[aAbB]s、%[a-z]s
%[^] 用於輸出時只讀取「[]」之外的字元,遇到為其內字元時會停止讀取,應用如%[^aAbB]s、%[^a-z]s

到這裡就大致介紹完格式指令詞了,如果有興趣可以參考以下:
microsoft docs


格式特殊字元

看完上面的格式指令字應該大概知道一些語法了,接下來有些特殊字元也跟輸出格式十分相關:

特殊字元 說明
\n new line的意思,即換行之符號
\0 字串結束符,輸出字串時遇到這個特殊字元就會結束輸出
\t tab,跳格
\r 回到該行字首,輸出時會覆蓋先前輸出(Ex. 輸出12345\raaaa時為「aaaa5」)
\b backspace,倒退一格輸出時可能覆蓋先前輸出(Ex. 輸出12345\baaaa時為「1234aaaa」、輸出12345\b時為「12345」)
\a bell,會發出系統聲
\
\' 輸出「'」
\" 輸出「"」

看到這裡我們就大致看完影響字串格式的語法有哪些了,礙於每一種都要示範輸出有點麻煩,大家可以多多嘗試上面介紹到的語法!

下一篇我們會正式進入列印輸出的printf!


尚未有邦友留言

立即登入留言