【C#學習筆記】【7】我想從鍵盤輸入變量的值,這樣程序就更靈活了(輸入輸出函數以及類型轉換)


我們在之前的文章中,對於變量的賦值(初始化)都是直接寫在程序中的,那如果想從鍵盤輸入,怎么做呢?我來介紹一個用於從鍵盤獲取輸入值的方法。

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;你試試,這樣會報錯么?所以@可以屏蔽關鍵字,這個你知道就好,不會用到的。

總結

  1. 怎么樣從控制台輸入一個值
  2. 類型怎么轉換
  3. 什么是顯式轉換和隱式轉換
  4. 輸出方法的多樣性
  5. 字符串旁邊的+是什么意思
  6. 轉義字符是什么
  7. 怎么不讓轉義字符轉義

練習

  1. 用戶輸入一個數,判斷其是奇數還是偶數,並且輸出,然后再讓用戶輸入一個數,判斷是否能被剛才的數整除,余數是多少。盡量使用今天的內容解答問題,並且加入適當的提示性信息,例如“請輸入一個數”之類的提示語,盡量使程序友善。

關於練習答案的聲明,以后可以直接給我發郵件索求練習題答案,並且進行交流,索求答案時注明文章的序號,例如今天的是7。以后不再占篇幅解答練習答案。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM