2017-02-14 57 views
-2
int main(){ 
    char c; 
    scanf("%c", &c); 
    printf("%d\n", c); 
} 

假設用戶輸入71並命中輸入。2位數字字符的Scanf值?

爲什麼c變成71,爲什麼只讀7而不是1

+3

你知道'char'是什麼嗎?單變量如何包含兩個值? –

+0

@EugeneSh。,是一個字符 – Onedayanam

+1

它又如何包含兩個字符呢? –

回答

0

你似乎錯過了一些關鍵的區別。

scanf函數將輸入的字符串作爲輸入。每個字符是表示一個8位的整數:

  • 可印刷字形諸如「7」,或「1」,或「G」
  • 一個控制字符,如換行(「\ n」 )或bel('\ a')
  • nul終止符(\0)它用於標記字符串的末尾。

(爲簡單起見,我假定ASCII,其他編碼可用)。

可打印字符在打印時會在屏幕上顯示爲字母,數字或符號。控制字符控制你的終端/顯示設備的功能(新行使得它將名義光標移動到下一行,而bel使得一些終端發出可聽見的嘟嘟聲)。


scanf做以該字符串輸入字符什麼是由格式字符串來控制:

  • %c讀取輸入字符無需轉換成char值。

  • %d將範圍'0'...'9'(即值0x30..0x39)中的字符序列轉換爲整數。

所以,當字符「7」與%c掃描爲一個字符,它給出的值0×37(十進制55)仍然假設ASCII。 當相同的字符進行掃描與%d一個整數,它需要值7

如果你要掃描的字符串「71」,爲整數值,使用%d(或%hhd如果由於某種原因你真的想要將它存儲在char中)。


現在,我們終於可以解決此評論:

...如果一個整數只有4個字節,我怎麼可以掃描一個5位數的整數?

讓我們考慮字符串「12345」,這是存儲在內存中

const char literal[6] = {0x31, 0x32, 0x33, 0x34, 0x35, 0x00}; 

如果掃描這個與%d,那麼這些5個非NUL字節將被轉換爲基10整數轉換爲值12345.

但是,如果使用%5c掃描相同的字符串,則將填充值爲{0x31, 0x32, 0x33, 0x34, 0x35}的5字符緩衝區。如果您嘗試使用普通的%c,那麼它當然只會讀取第一個字符,即0x31。

1

'7'是一個字符,'1'是一個字符。字符「G」具有的71型「G」十進制值,你會得到71如果你要掃描一些你可以:

int i; 
scanf("%d", &i); 
printf("Value %d = char(%c)", i, (char)i); 

一旦系統scanf函數的「7」它有一個角色在等待並停止聆聽 - 你的'1'還沒有被「掃描」過!

1

聲明

scanf ("%c", &c); 

是指「從標準輸入讀取一個字節,並將其放置到變量c」。沒有轉換完成。在你的例子中,字節是'7',假設程序運行在使用ASCII(或超集,如UTF-8)字符編碼的區域中,與'\x37'55相同。請注意,分配給c的值取決於當前語言環境使用的字符編碼。

通過比較,一個聲明如

scanf ("%d", &i); 

指「讀取一個或多個字符表示來自標準輸入十進制數字,這些十進制數字轉換爲一個整數值,並將該值存儲在變量i「。請注意,分配給變量i的值不取決於當前語言環境使用的字符編碼,當然,標準輸入使用程序所期望的編碼。