我們在之前的文章中,對於變量的賦值(初始化)都是直接寫在程序中的,那如果想從鍵盤輸入,怎么做呢?我來介紹一個用於從鍵盤獲取輸入值的方法。
Console.ReadLine()方法
看到這個標題,是不是想起了什么?對,我們之前用的輸出函數Console.WriteLine()方法。今天我們再介紹一下輸入函數。
猜猜怎么用?好吧,我介紹一下用法:
string s; s=Console.ReadLine(); Console.WriteLine(s);
從上面的例子中我們可以看出,Console.ReadLine()會從鍵盤讀取一個數,並且把結果賦值給s。是不是用法很簡單呢?讓我們思考一個問題。
編寫一個程序,從鍵盤輸入兩個整數,並且輸出他們的和。
哇,你寫出來了么?是不是寫了類似的語句 int a=Console.ReadLine();執行時報錯了,錯誤列表告訴我們:無法將類型string隱式轉換為int。這是神馬意思呢?
通過查資料(MSDN幫助文件的使用后文會講解)我們發現,Console.ReadLine()的結果是字符串類型,即string。而我們需要的是一個int整數,那我們怎么將string轉換成我們需要的類型呢?下面我們介紹轉換方法。
變量的類型轉換
在這里,我們介紹兩種常用的轉換方式,一種是利用Convert轉換,一種是強制轉換(不是任何地方都可以強制轉換)。當然我會告你剛才的錯誤中所說的隱式轉換是什么東西。
Convert類型轉換
我先給出上面思考題的解決方法。
string s1=Console.ReadLine(); int a1=Converrt.ToInt32(s); string s2=Console.ReadLine(); int a2=Converrt.ToInt32(s); int sum=a1+a2; Console.WriteLine(sum);
從上面的例子中可以看出,我用的Convert.ToInt32()這樣的語句進行轉換為int整數的,括號里的是待轉換的變量,這個變量其實可以不只是string類型,可以是任意類型(可能會出錯,后面講)。這樣的轉換是不是也是很簡單,那你猜猜轉換為double類型怎么做呢?不知道你猜到沒有,那就是Convert.ToDouble()方法。還有一個常用的方法就是Convert.ToBoolean();這個會將“true”或者“false”的字符串轉換為bool類型的變量。我們需要知道的就這三個。
你可能會有疑問,為什么不介紹轉換為string類型的方法呢。第一個是我們輸入的直接就是string類型,而且任意類型都會自動(隱式)轉換為string類型。而且你可以明確的用方法轉換為string類型,那就是Convert.ToString();
剛才我說了,轉換過程中可能會出錯,你能想到是什么樣的錯誤么?
例如我從鍵盤輸入了一個這樣的字符串“asdfbh23sdf562dfs”,你能將他轉換為整數int類型嗎?貌似說不通,也做不到,除非你自己寫一個轉換方法(后面咱們可以嘗試一下)。還有一種情況,我輸入的是數字,例如“123654132154561324564132”,這個要是轉換成int會出什么樣的錯誤呢?前文我提到,每種變量類型是有范圍的,不是任意的值都可以,當然,這個字符串的范圍顯然超出了int類型的范圍,那當然會出錯嘍。至於這兩種問題(用戶導致的錯誤,而不是我們寫程序的)怎么解決,我們以后在異常那里會詳細說。
強制轉換
其實我不喜歡這種方式,會經常出錯,而且試用范圍小。方法就是在待轉換變量前加一個括號,括號里寫目標類型,如下:
double a=6.568; int b=(int)a; Console.WriteLine(b); //結果是6,顯然精度丟失了,我們有時候用這個方法取整數。前文提到過。
這個方法就簡單提一下。下面介紹一下顯式轉換和隱式轉換。
顯式轉換與隱式轉換
用我的理解來定義這兩種轉換的話,我們明確指出的並且采用以上兩種方法的轉換就是顯式轉換。而程序自己默認轉換的就是隱式轉換。其實,我們前面已經用了很多的隱式轉換,例如,兩個整數相除時我們總是乘以0.1來讓結果變成double型。還有我們常用的輸出方法,Console.WriteLine(),其實括號中只接受string類型,而我們操作時經常把任意類型放進去,其實程序在這里自己做了隱式轉換。那么,什么時候可以進行隱式轉換呢?
也就是說,小類型轉換為大類型。如int可以隱式轉換為double,反過來卻不能,為什么呢?很好理解,小容器內的水總能全部倒入到大容器而不出錯,反過來,可能會把水溢出來。(我在之前也說過,把類型理解為裝指定范圍值的容器)這樣也解釋了,任何變量類型總能轉換為string字符串。因為string可以存放任意長度的任意東西。
隱式轉換順序如下:
char >> int >> double >> string;
bool >> string
你看完是不是想說我在玩兒你,char字符類型的怎么可以轉換為整數int,例如a的整數是多少。我想請你打消顧慮,他的確可以進行轉換,其實轉換的結果就是char對應的Ascii碼表(點擊查看什么是ascii碼)的值。例如下面的程序:
char a = 'a'; int b = a;//這里有隱式轉換char>>int char c = (char)(a + 1); //這是什么玩意兒?其實就是把a先隱式轉換為int,然后加1,再強制轉換會char類型 Console.WriteLine(a); Console.WriteLine(b); Console.WriteLine(c); /* * 運行結果 * a * 97 * b */
你嘗試一下,輸出“abcde……xyz”(用循環)
參考
char a = 'a'; char b; for (int i = 0; i < 26; i++) { b = (char)(a+i); Console.WriteLine(b); }
多彩繽紛的輸出方法Console.WriteLine()
在之前我們使用這個輸出方法,總是輸出單一的變量或者一句簡單的字符串。那么,怎么進行多彩繽紛的輸出呢?例如用戶輸入了一個值,我們再輸出一句話,“您輸入的是XXX”來讓用戶確認輸入的正確性。我們來改造一開始那個用戶輸入兩個整數,輸出和的程序。我這樣寫:
Console.WriteLine("請輸入變量A:"); int a=Convert.ToInt32(Console.ReadLine()); Console.WriteLine("請輸入變量B:"); int b = Convert.ToInt32(Console.ReadLine()); int c = a + b; Console.WriteLine("您輸入的A變量是" + a + ",您輸入的A變量是" + b + ",他們的和是" + c);
先執行一下,效果是不是比剛才好多了呢?需要解釋的是第二行的代碼,我把聲明和轉換寫成了一句,你是否理解了呢?還有最后一行的輸出,亂七八糟的是什么啊?我重點介紹一下輸出:
還記得剛才那句話么,輸出方法的括號里需要的類型是字符串,而我這里面寫了一堆加號是干啥的?難道int類型還能加字符串?
其實,當加號出現在字符串旁邊時,他已經失去了加法運算的性質,而變成了連接兩個字符串(如“hello,”+“北京你好”的結果就是“hello,北京你好”),而此時參與連接的abc這些整數變量,已經隱式轉換為了string。所以上面程序輸出的結果就是你運行的那樣嘍。
上面那種方法是不是看着眼暈呢?其實還有更好地方法,占位符!
我把上面的最后一句話改成這樣的:
Console.WriteLine("您輸入的A變量是{0},您輸入的A變量是{1},他們的和是{2}",a,b,c);
上面的{0},{1}這樣的符號就是占位符了,顧名思義,占着位子的符號,也就是說,這些東西占了位置,需要用東西填補起來,也就是逗號后面的對應的變量嘍。需要說明的占位符的序號必須從0開始。你會了么?自己試一下。將A和B的和差積商都輸出。
思考一個問題,我們輸入時候,不知道你留心沒,智能提示有個類似的方法,Console.Write(),那么和WriteLine什么區別,哈哈,你猜到了么?
寫如下的程序,來看一下區別:
Console.WriteLine("你好世界!"); Console.WriteLine("我愛你!!!"); Console.WriteLine("------華麗的分隔符-------"); Console.Write("你好世界!"); Console.Write("我愛你!!!"); /*運行結果 * 你好世界! * 我愛你!!! * ------華麗的分隔符------- * 你好世界!我愛你!!! */
發現點什么嗎?原來他倆就差着輸出完是否換行,WriteLine輸出完后,會自動換行,而Write卻不會,你記住了嗎?
思考:我們怎么輸入換行呢?而且還有一個嚴重的問題,你是否能將字符串“高爾基說:“書是人類進步的階梯”。這句話告訴我們要多讀書!”賦值給一個string變量呢?是不是發現問題了?雙引號沒辦法賦值給字符串,因為它本身表示字符串的開始或者結尾,我們下面介紹處理這兩個問題的方法!
轉義字符
從字面講,就是轉換含義的字符,我介紹幾個常用的。見下表:
| 轉義字符 | 含義 | 示例 |
| \n | 換行符 | Console.Write(“我愛你北京!!!\n”) |
| \r | 回車符 | 注意,鍵盤的回車鍵相當於\t\n的組合,回車鍵是回車加換行 |
| \t | 制表符 | 鍵盤的Tab鍵 |
| \” | 雙引號 | 表示是一個雙引號,此處雙引號不再是字符串的開頭或者結尾(這里是英文半角雙引號,中文的雙引號可以直接輸入的) |
| \\ | \(單斜線) | 表示一個斜線,由於單斜線意味着轉義,所以想輸出單斜線,必須\\ |
舉個例子,比如文件的路徑C:\windows\system32\我的”電影”怎么表示呢?(不要想多了啊,電影加了引號,還是電影,嘿嘿)
string s="C:\\windows\\system32\\我的\"電影\"";
你看,我是不是用雙斜線代替了單斜線,用\”代替了雙引號。
如果我這個字符串中有\n,我不想讓他表示轉義的換行符,就是簡單的\n字符串,那么我們怎么辦?我們可以在字符串前加原意字符@,如下
string s=@"C:\windows\system32\我的電影";
這樣輸出的單斜線還是單斜線。你是不是好奇,我為什么取消\”了,因為在加原意字符@的字符串中,\”會出問題,你可以自己嘗試一下(多試驗才會知道)!
考慮一個有趣的問題,你能聲明一個名字是if的變量么?貌似不可以吧,我告訴你可以這樣做,int @if;你試試,這樣會報錯么?所以@可以屏蔽關鍵字,這個你知道就好,不會用到的。
總結
- 怎么樣從控制台輸入一個值
- 類型怎么轉換
- 什么是顯式轉換和隱式轉換
- 輸出方法的多樣性
- 字符串旁邊的+是什么意思
- 轉義字符是什么
- 怎么不讓轉義字符轉義
練習
- 用戶輸入一個數,判斷其是奇數還是偶數,並且輸出,然后再讓用戶輸入一個數,判斷是否能被剛才的數整除,余數是多少。盡量使用今天的內容解答問題,並且加入適當的提示性信息,例如“請輸入一個數”之類的提示語,盡量使程序友善。
關於練習答案的聲明,以后可以直接給我發郵件索求練習題答案,並且進行交流,索求答案時注明文章的序號,例如今天的是7。以后不再占篇幅解答練習答案。
