天天看點

如何從鍵盤輸入數字字元|隻有在輸入完資料再按Enter鍵後,該行資料才被送入記憶體上的鍵盤緩沖區裡,形成輸入流C++中怎樣在輸入流中差別int類型和字元類型?(進一步的問題,有補充浮點數的情況)控制台和端口 I/O

1、如何從鍵盤輸入數字字元?用如getchar()函數時即可,即從鍵盤輸入7,獲得即是字元'7'。

2、隻有在輸入完資料再按Enter鍵後,該行資料才被送入記憶體上的鍵盤緩沖區裡,形成輸入流。

而在輸入完資料再按Enter鍵後,該行資料才被送入記憶體上的鍵盤緩沖區裡這一工作是由鍵盤驅動程式來完成的,即鍵盤驅動程式(程式設計設計該程式時)是以Enter鍵為标志符将暫存在鍵盤這個輸入裝置的緩存器(屬于鍵盤這個硬體裝置的一部分)裡的輸入資料送入記憶體上的鍵盤緩沖區裡,程式設計設計該程式時檔案結束符是作為一個普通字元對待的,未将其作為啥标志符的作用,是以鍵盤驅動程式遇到檔案結束符輸入時不會像Enter鍵輸入那樣發生将暫存在鍵盤這個輸入裝置的緩存器(屬于鍵盤這個硬體裝置的一部分)裡的輸入資料送入記憶體上的鍵盤緩沖區裡的情況。而像

getchar()函數或是cin的輸入符>>等輸入函數(在軟體層次上相對于鍵盤驅動程式,是其上層接口函數)開始執行時都是先判斷記憶體上的鍵盤緩沖區裡的資料是否為空,為空的話就處于等待狀态,直到有資料來時才開始讀取記憶體上的鍵盤緩沖區裡的資料到相應的變量上。可以參看-控制台和端口 I/O等内容。

getchar()函數或是cin的輸入符>>等輸入函數(在軟體層次上相對于鍵盤驅動程式,是其上層接口函數)則是在程式設計設計該函數時以檔案結束符作為将其讀取的輸入流(緩存)的狀态是否置為無效的标志之一。其他無效字元,視具體情況而定,如cin>>var,如果var是char類型的變量,則輸入字元k,k不會視為無效字元而讓輸入流狀态置為無效,如果var是int或是float等非字元資料類型的變量,則輸入字元k,k會視為無效字元而讓輸入流狀态置為無效。

附加:

從鍵盤輸入4個9以内的數字字元

2014年02月25日 ⁄ 綜合⁄ 共 471字 ⁄ 字号 小 中 大 ⁄ 評論關閉

 從鍵盤輸入4個9以内的數字字元,将其轉換為4位十進制數後顯示出來。

#include "stdafx.h"

#include"stdio.h"

int main(int argc, char* argv[])

{

 char c;

 int i,data=0;

 printf("Input char:");

 for(i=0;i<4;i++)

 {

 c=getchar();//輸入一數字字元。

 if(c<'0'||c>'9')//判斷輸入字元是否在'0'~'9'範圍内。

  break;

 data=data*10+c-'0';//計算目前資料值。

 }

 printf("data=%d/n",data);

 return 0;

}

參考:http://www.xuebuyuan.com/1854888.html

=========================================================

C++中怎樣在輸入流中差別int類型和字元類型?(進一步的問題,有補充浮點數的情況)

标簽: 計算機軟體網際網路修改

在實際測試中,使用@whistler 君及@精英王子 君的方法時,的确可以識别字元類型(如a,+等),但若輸入浮點數類型(如1.2)仍然會跳出循環進入下一步。而我希望的是除了某幾個特定整數(如1,2,3)外其他所有的非法輸入都能給出報錯結果并且不影響重複輸入,如果能對不同的錯誤(字元,非要求整數,浮點數)提示不同的資訊則更佳。請問諸位如何解決浮點數輸入時跳出報錯循環的情況?另外既然跳出了循環那x的值是幾呢(經測試,輸入1.2,值為1)?算是強制類型轉換嗎?

-----------------------原問題---------------------------------------------------------------------

有一個位置我需要輸入整數,int x;cin>>x,若故意輸入一個字元,則此處會無限循環。請問如何在輸入為字元時(如a)将其分辨出來以給出錯誤資訊呢?多謝諸位高手。

-----------------------------------------------------------------------------------------------------

把@whisky 君的方案貼一下,未授權,望諒解。

int read(){

char c;

while( c= getchar(), !isdigit(c) );

int r= c-'0';

while( c= getchar(), isdigit(c) ) r= r*10 + c-'0';

return r;

}

這個是我平時寫題目用的讀入優化能自動判斷字元和數字。隻不過沒有警告功能。要警告的話。。可能是這樣的。

int read(){

char c;

while( gets(&c))

{

if(!isdigit(c))cout<<"NAN";

else break;

}

int r= c-'0';

while( c= getchar(), isdigit(c) ) r= r*10 + c-'0';

return r;

} 第二個沒調過不知道能不能用- -

7條讨論| 修改記錄

随鳥走天涯

分享到: 豆瓣 新浪微網誌 QQ空間 微信 騰訊微網誌 0 推薦  (0) | 收藏 | 1人關注 關注 7個答案 3 0

如何從鍵盤輸入數字字元|隻有在輸入完資料再按Enter鍵後,該行資料才被送入記憶體上的鍵盤緩沖區裡,形成輸入流C++中怎樣在輸入流中差別int類型和字元類型?(進一步的問題,有補充浮點數的情況)控制台和端口 I/O

精英王子高中退學,獨立開發者,獨立部落格作者,深度 Git...

2012-06-19 21:09 支援者: whistler 随鳥走天涯 we_cry

#include <iostream>

using namespace std;

int main()

{

int num;

cin.clear();//清空上次的錯誤資訊

cin>>num;//在這裡我們期望輸入一個數字

if(cin.good()) //如果成功了

{

cout<<"你輸入的數字是"<<num<<endl;

}

else //如果沒成功(輸入的不是數字)

{

cout<<"輸入有誤"<<endl;

cin.ignore();//丢棄緩沖區中錯誤的輸入

}

}

//------------分割線--------------

#include <iostream>

using namespace std;

int main()

{

int num;

//如果我們要使用者輸入一個數字,可以這麼做:

cout<<"請輸入一個數字:";

while(true) //一直循環

{

cin.clear();//清空上次的錯誤資訊

cin>>num; //從鍵盤讀取輸入

if(cin.good()) //如果成功了

break; //退出循環

else

{

//下一句是丢棄緩沖區中錯誤的輸入

//這很重要,否則錯誤的輸入會一直留在緩沖區裡面,導緻程式死循環

cin.ignore();

cout<<"輸入有誤,請重新輸入:";

}

}

//到這裡,num裡面就是一個有效的數字了

cout<<"你輸入的數字是"<<num<<endl;

}

3條讨論

2 0

如何從鍵盤輸入數字字元|隻有在輸入完資料再按Enter鍵後,該行資料才被送入記憶體上的鍵盤緩沖區裡,形成輸入流C++中怎樣在輸入流中差別int類型和字元類型?(進一步的問題,有補充浮點數的情況)控制台和端口 I/O

whistler軟體工程學生、Python愛好者

2012-06-19 21:11 支援者: 精英王子 随鳥走天涯

如何從鍵盤輸入數字字元|隻有在輸入完資料再按Enter鍵後,該行資料才被送入記憶體上的鍵盤緩沖區裡,形成輸入流C++中怎樣在輸入流中差別int類型和字元類型?(進一步的問題,有補充浮點數的情況)控制台和端口 I/O

cin>>x自身會傳回狀态的

cin.sync()是清空緩沖區

cin.clear()是清除cin可能的出錯狀态

以上代碼均在std命名空間裡面跑的~

添加讨論

0 0

如何從鍵盤輸入數字字元|隻有在輸入完資料再按Enter鍵後,該行資料才被送入記憶體上的鍵盤緩沖區裡,形成輸入流C++中怎樣在輸入流中差別int類型和字元類型?(進一步的問題,有補充浮點數的情況)控制台和端口 I/O

we_cry空間資訊與數字技術專業

2012-06-19 20:51

我記的 @精英王子 做過一個關于判斷這是不是數字的,具體内容忘記了。。。

p.s. 這裡有一個: http://technet.microsoft.com/zh-cn/library/078sfkak.aspx

參考:

http://www.guokr.com/question/237697/

=======================================================================

控制台和端口 I/O

Visual Studio 2013

這些例程讀寫在控制台上或指定端口。 控制台 I/O 例程與流 I/O 或底層 I/O 庫類型程式相容。在執行 I/O之前,不必打開控制台或端口或關閉,是以此類别中打開或關閉的例程。 在 Windows 作業系統中,這些函數的輸出始終處理到控制台,不能重定向。

控制台和端口 I/O例程。

例程 使用
_cgets, _cgetws,_cgets_s、_cgetws_s。 從控制台讀取字元串
_cprintf,_cwprintf,_cprintf_s、_cprintf_s_l、_cwprintf_s、_cwprintf_s_l 将格式化的資料寫入控制台。
_cputs 把字元串寫入控制台
_cscanf,_cwscanf,_cscanf_s、_cscanf_s_l、_cwscanf_s、_cwscanf_s_l 從控制台讀取格式化的資料
_getch、_getwch 從控制台讀取字元
_getche、_getwche 從控制台讀取字元以及回顯它
_inp 從指定的I/O端口讀取一個位元組
_inpd 從指定 I/O 端口讀取雙字
_inpw 讀取指定 I/O 端口 2 位元組的單詞
_kbhit 在控制台檢查鍵擊;在嘗試從控制台讀取使用
_outp 寫入位元組到指定 I/O 端口
_outpd 對指定的 I/O 端口的寫雙字
_outpw 對指定的 I/O 端口的寫位元組
_putch、_putwch 向控制台寫入字元
_ungetch,_ungetwch “Unget”是從控制台讀取的最後一個字元,是以它是下一個要被讀取的字元。

請參見

參考

輸入和輸出 按類别分的運作時例程 https://technet.microsoft.com/zh-cn/library/7x2hy4cx.aspx

參考:

如何從鍵盤輸入字元型的數字 谷歌

繼續閱讀