int main(){
char c;
scanf("%c", &c);
printf("%d\n", c);
}
假設用戶輸入71
並命中輸入。2位數字字符的Scanf值?
爲什麼c
變成71
,爲什麼只讀7
而不是1
?
int main(){
char c;
scanf("%c", &c);
printf("%d\n", c);
}
假設用戶輸入71
並命中輸入。2位數字字符的Scanf值?
爲什麼c
變成71
,爲什麼只讀7
而不是1
?
你似乎錯過了一些關鍵的區別。
scanf
函數將輸入的字符串作爲輸入。每個字符是表示一個8位的整數:
\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。
'7'是一個字符,'1'是一個字符。字符「G」具有的71型「G」十進制值,你會得到71如果你要掃描一些你可以:
int i;
scanf("%d", &i);
printf("Value %d = char(%c)", i, (char)i);
一旦系統scanf函數的「7」它有一個角色在等待並停止聆聽 - 你的'1'還沒有被「掃描」過!
聲明
scanf ("%c", &c);
是指「從標準輸入讀取一個字節,並將其放置到變量c
」。沒有轉換完成。在你的例子中,字節是'7'
,假設程序運行在使用ASCII(或超集,如UTF-8)字符編碼的區域中,與'\x37'
或55
相同。請注意,分配給c
的值取決於當前語言環境使用的字符編碼。
通過比較,一個聲明如
scanf ("%d", &i);
指「讀取一個或多個字符表示來自標準輸入十進制數字,這些十進制數字轉換爲一個整數值,並將該值存儲在變量i
「。請注意,分配給變量i
的值不取決於當前語言環境使用的字符編碼,當然,標準輸入使用程序所期望的編碼。
你知道'char'是什麼嗎?單變量如何包含兩個值? –
@EugeneSh。,是一個字符 – Onedayanam
它又如何包含兩個字符呢? –