c語言入門將ASCII碼和字元相互轉換及其思考
#include<stdio.h>
void main()
{
unsigned char a;
printf("enter char:");
scanf("%C",& a );
printf("ascii = %d", a );//強制轉化為ascii碼
}
同理;
#include<stdio.h>
void main()
{
unsigned char a;
printf("enter ascii:");
scanf("%d",& a );
printf("code = %c", a );
}
個人的兩個小思考(歡迎評論講講你的看法)
1.如果輸入的是字串而非字元會出現如下情況
如果輸入一個超出ascii碼上限255的數此時應當是資料溢位
例如輸入259 出現003對應的小桃心
2.如果先定義a為int或其他形式變數
格式化符號與變數型別 沒有一一對應會怎樣?
scanf (“格式化符號串”,變數1,變數2,…); printf (“格式化符號串”,變數1,變數2,…); ? 如果格式化符號與變數型別沒有一一對應, 同樣會給出一個結果,但造成的結局是:① 錯誤或不可預期的輸入輸出結果,或者,② 程式異常或崩潰(絕非危言聳聽)
printf例項
char c='a'; int i=100; float f=1.234f; printf(“c = %c i = %d f = %f\n” , c, i, f); //正確 printf(“c = %c i = %d f = %f\n” , i, f, c); //錯誤 輸出:c = a i = 100 f = 1.234000 c = d i = -1073741824 f = 0.000000
scanf例項
char c; int i; float f; scanf("%c%d%f", &i, &f, &c); //錯誤 printf("c = %c i = %d f = %f\n" , c, i, f); //正確 輸入:a 100 1.234 輸出:c = ? i = -858993567 f = 0.000000
最後附上一個c語言常見輸入輸出函式陷阱的小提示:
scanf與printf的陷阱
幾個常見問題的說明
1. 2. 3. 4. 字元與字串 轉義字元 格式化符號 字串如何換行書寫
字元與字串
字元常量:‘a? , ?0? , ?A? 字元變數:char c1, c2 = ?x?; 字串:“abcdefg” 字元的實質:一個數據,這個資料指明 這個字元在ASCII表中的位置 字串的實質:字元構成的序列
關於轉義字元
? ‘\n?是一個整體,本質是一個字元常量,例 如可以定義: char c = ?\n?; ? 但字元‘\n?不能顯示,而是代表在這裡要進 行一次換行,這種特殊功能的字元稱為轉義 字元 ? 雖然‘\n?不能顯示,但仍然要佔用一個字元 單元 ? 類似的轉義字元還有‘\t? (製表符)、‘\b? (蜂鳴)等等 ? 並不是所有的轉義字元都不能顯示(見教材)
格式化符號
%d %f %c 整型 浮點型 字元型
int a=10, b=10, c=10; printf(“a = %d b = %d c = %d\n” , a, b, c); 雖然abc都是同樣的整型,但是%d一個也 不能少;scanf同理
字串如何換行書寫
? 方法一: printf(“Hello World!\n” “I like programming!\n”); ? 方法二: printf(“Hello World!\n\ I like programming!\n”);
危險指數 ★
陷阱1 不要忘記‘\n?
? printf函式並不另起一行輸出,而是接著 當前游標的位置輸出;如果要換行輸出, 則一定要加上‘\n?。 ? 如下頁的例子:
printf(“Hello World!”); printf(“I like programming!”); 輸出為: Hello World! I like programming!(游標)
printf(“Hello World!\n”); printf(“I like programming!\n”); 輸出為: Hello World! I like programming! (游標)
危險指數 ★ ★
陷阱2 scanf — 如果出現了就一定要輸入
? 例如: int i, j; scanf(“%d%d”, &i, &j); ? scanf從左至右掃描使用者的輸入,並與格式化 符號串(本例中為“%d%d”)進行匹配,每當 遇到一個格式化符號(本例中為 ‘%d’)就 將使用者輸入的資料傳遞給與這個格式化符號 對應的引數中去 ? 注意:此種情況空格或回車代表一個數據的 結束
? 而如果在格式化符號串裡出現了非格式 化符號的常規字元,例如: int i, j; scanf(“%dABC%d”, &i, &j); ? 這種情況下就必須如下輸入才被正確接 收
100ABC200 輸入結果: i=100 j=200
危險指數 ★ ★ ★
陷阱3 %f - 你能輸入double嗎?
? 如果希望輸入雙精度數,以下的程式能 否正常工作: double d; scanf(“%f”, &d); ? 事實證明這樣是不行的
double 應該如何輸入?
? 對以上程式做簡單改動:
double d; scanf(“%lf”, &d);
? 這樣就可以正確輸入了,原因很簡單, %lf代表這是一個long float,實際上就是 double
危險指數 ★ ★ ★ ★
陷阱4 格式化符號與變數型別 沒有一一對應會怎樣?
scanf (“格式化符號串”,變數1,變數2,…); printf (“格式化符號串”,變數1,變數2,…); ? 如果格式化符號與變數型別沒有一一對應, 同樣會給出一個結果,但造成的結局是:① 錯誤或不可預期的輸入輸出結果,或者,② 程式異常或崩潰(絕非危言聳聽)
printf例項
char c='a'; int i=100; float f=1.234f; printf(“c = %c i = %d f = %f\n” , c, i, f); //正確 printf(“c = %c i = %d f = %f\n” , i, f, c); //錯誤 輸出:c = a i = 100 f = 1.234000 c = d i = -1073741824 f = 0.000000
scanf例項
char c; int i; float f; scanf("%c%d%f", &i, &f, &c); //錯誤 printf("c = %c i = %d f = %f\n" , c, i, f); //正確 輸入:a 100 1.234 輸出:c = ? i = -858993567 f = 0.000000
危險指數 ★ ★ ★ ★ ★
陷阱5 千萬不要忘記 &
int i; scanf(“%d”, i); // i前忽略了& ? 這樣的程式碼執行後會造成什麼結果? ? 結果是記憶體中某個地方几個位元組的內容 被修改,如果恰好是記憶體中重要的內容 被修改,系統將失去穩定或崩潰
C++中是否還有這樣的陷阱?
? scanf與printf是C語言標準庫中的經典函 數,C語言中的一切在C++語言中都可以 繼續應用,包括scanf與printf,但C++語 言的標準庫中提供了更好的scanf與printf 的替代品,那就是cin與cout ……