青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

為你寫詩

c/c++
隨筆 - 32, 文章 - 0, 評論 - 3, 引用 - 0
數據加載中……

c++ 輸入函數的比較和運用

cin, cin.get(),cin.getline()

文章分類:C++編程

cin讀入數據遇到空格結束;并且丟棄空格符,輸入遇到回車符結束,很正常。

 

二.cin.get()

該函數有三種格式:無參,一參數,二參數

即cin.get(), cin.get(char ch), cin.get(array_name, Arsize)

讀取字符的情況:

輸入結束條件:Enter鍵

對結束符處理:不丟棄緩沖區中的Enter

cin.get() 與 cin.get(char ch)用于讀取字符,他們的使用是相似的,

即:ch=cin.get() 與 cin.get(ch)是等價的

程序5
#include
using namespace std;
int main()
{
       char c1, c2;
       cin.get(c1);
       cin.get(c2);
       cout<<<" SPAN < ?<<測試一輸入:
a[Enter]
輸出:
a
97 10
【分析】會發現只執行了一次從鍵盤輸入,顯然第一個字符變量取的'a', 第二個變量取的是Enter(ASCII值為10),這是因為該函數不丟棄上次輸入結束時的Enter字符,所以第一次輸入結束時緩沖區中殘留的是上次輸入結束時的Enter字符!
測試二輸入:
a b[Enter]
輸出:
a
97 32
【分析】顯然第一個字符變量取的'a', 第二個變量取的是Space(ASCII值為32)。原因同上,沒有丟棄Space字符。
讀取字符串的情況:
cin.get(array_name, Arsize)是用來讀取字符串的,可以接受空格字符,遇到Enter結束輸入,按照長度(Arsize)讀取字符, 會丟棄最后的Enter字符。
程序6
#include
using namespace std;
int main ()
{
char a[20];
cin.get(a, 10);
cout<<
return 0;
}
測試一輸入:
abc def[Enter]
輸出:
abc def
【分析】說明該函數輸入字符串時可以接受空格。
測試二輸入:
1234567890[Enter]
輸出:
123456789
【分析】輸入超長,則按需要的長度取數據。
程序7
#include
using namespace std;
int main ()
{
char ch, a[20];
cin.get(a, 5);
cin>>ch;
cout<<
cout<<(int)ch<< FONT>
return 0;
}
測試一輸入:
12345[Enter]
輸出:
1234
53
【分析】第一次輸入超長,字符串按長度取了"1234",而'5'仍殘留在緩沖區中,所以第二次輸入字符沒有從鍵盤讀入,而是直接取了'5',所以打印的ASCII值是53('5'的ASCII值)。
測試二輸入:
1234[Enter]
a[Enter]
輸出:
1234
97
【分析】第二次輸入有效,說明該函數把第一次輸入后的Enter丟棄了!
  
三. cin.getline()
cin.getline() 與 cin.get(array_name, Arsize)的讀取方式差不多,以Enter結束,可以接受空格字符。按照長度(Arsize)讀取字符, 會丟棄最后的Enter字符。
但是這兩個函數是有區別的:
cin.get(array_name, Arsize)當輸入的字符串超長時,不會引起cin函數的錯誤,后面的cin操作會繼續執行,只是直接從緩沖區中取數據。但是 cin.getline()當輸入超長時,會引起cin函數的錯誤,后面的cin操作將不再執行。(具體原因將在下一部分"cin的錯誤處理"中詳細介紹)
程序8
#include
using namespace std;
int main ()
{
char ch, a[20];
cin.getline(a, 5);
cin>>ch;
cout<<
cout<<(int)ch<< FONT>
return 0;
}
測試輸入:
12345[Enter]
輸出:
1234
-52
【分析】與cin.get(array_name, Arsize)的例程比較會發現,這里的ch并沒有讀取緩沖區中的5,而是返回了-52,這里其實cin>>ch語句沒有執行,是因為cin出錯了!
 

<

C/C++學習筆記1 - 深入了解scanf()/getchar()和gets()等函數

http://blog.csdn.net/lewsn2008
----------------------------------------------------
| 問題描述一:(分析scanf()和getchar()讀取字符)   |
----------------------------------------------------
    scanf(), getchar()等都是標準輸入函數,一般人都會覺得這幾個函數非常簡單,沒什么特殊的。但是有時候卻就是因為使用這些函數除了問題,卻找不出其中的原因。下面先看一個很簡單的程序:
程序1:
    #include
    int main()
    {
char ch1, ch2;
scanf("%c", &ch1);
scanf("%c", &ch2);
printf("%d %d ", ch1, ch2);
return 0;
    }
    或者是:
    #include
    int main()
    {
char ch1, ch2;
ch1 = getchar();
ch2 = getchar();
printf("%d %d ", ch1, ch2);
return 0;
    }
    程序的本意很簡單,就是從鍵盤讀入兩個字符,然后打印出這兩個字符的ASCII碼值。可是執行程序后會發現除了問題:當從鍵盤輸入一個字符后,就打印出了結果,根本就沒有輸入第二個字符程序就結束了。例如用戶輸入字符'a', 打印結果是97,10。這是為什么呢?
【分析】:
    首先我們呢看一下輸入操作的原理,程序的輸入都建有一個緩沖區,即輸入緩沖區。一次輸入過程是這樣的,當一次鍵盤輸入結束時會將輸入的數據存入輸入緩沖區,而cin函數直接從輸入緩沖區中取數據。正因為cin函數是直接從緩沖區取數據的,所以有時候當緩沖區中有殘留數據時,cin函數會直接取得這些殘留數據而不會請求鍵盤輸入,這就是例子中為什么會出現輸入語句失效的原因!
    其實這里的10恰好是回車符!這是因為scanf()和getchar()函數是從輸入流緩沖區中讀取值的,而并非從鍵盤(也就是終端)緩沖區讀取。而讀取時遇到回車( )而結束的,這個會一起讀入輸入流緩沖區的,所以第一次接受輸入時取走字符后會留下字符,這樣第二次的讀入函數直接從緩沖區中把取走了,顯然讀取成功了,所以不會再從終端讀取!這就是為什么這個程序只執行了一次輸入操作就結束的原因!

----------------------------------------------------
| 問題描述二:(分析scanf()和gets()讀取字符串)   |
----------------------------------------------------

首先我們看一下scanf()讀取字符串的問題:
程序2:
    #include
    int main()
    {
char str1[20], str2[20];
scanf("%s",str1);
printf("%s ",str1);   
scanf("%s",str2);
printf("%s ",str2);
return 0;
    }
    程序的功能是讀入一個字符串輸出,在讀入一個字符串輸出。可我們會發現輸入的字符串中不能出現空格,例如:
測試一輸入:
Hello world!
輸出:
Hello
world!
【分析】到此程序執行完畢,不會執行第二次的讀取操作!這個問題的原因跟問題一類似,第一次輸入Hello world!后,字符串Hello world!都會被讀到輸入緩沖區中,而scanf()函數取數據是遇到回車、空格、TAB就會停止,也就是第一個scanf()會取出"Hello",而"world!"還在緩沖區中,這樣第二個scanf會直接取出這些數據,而不會等待從終端輸入。

測試二:
Hello[Enter]
Hello[輸出]
world[Enter]
world[輸出]
【分析】程序執行了兩次從鍵盤讀入字符串,說明第一次輸入結束時的回車符被丟棄!即:scanf()讀取字符串會舍棄最后的回車符!


我們再看一下gets()讀取字符串的情況:
用scanf來讀取一個字符串時,字符串中是不可以出現空格的,一旦出現空格,后面的數據就會舍棄殘留在緩沖區中。其實有另外一個函數是可以接受空格的,那就是gets(),下面我們看一下這個函數的應用,我們把程序2改動一下:
程序3:
#include
int main()
{
char str1[20], str2[20];
gets(str1);
printf("%s ",str1);   
gets(str2);
printf("%s ",str2);
return 0;
}
測試:
Hello world! [輸入]
Hello world! [輸出]
12345 [輸入]
12345 [輸出]
【分析】顯然與上一個程序的執行情況不同,這次程序執行了兩次從鍵盤的讀入,而且第一個字符串取了Hello world! 接受了空格符,而沒有像上一個程序那樣分成了兩個字符串!所以如果要讀入一個帶空格符的字符串時因該用gets(), 而不宜用scanf()!


--------------------------------------------------------
| 問題描述三:(getchar()暫停程序,查看程序執行結果)|
--------------------------------------------------------
    不知道大家有沒有遇到過這樣的問題,有的編譯器程序執行完后的結果界面不會停下而是一閃就沒了,以至于看不到執行結果。所以很多人在程序最后加上 getchar()語句,目的是想讓程序執行完后停下來,等待從終端接收一個字符再結束程序。可是發現有時候這樣根本沒用,程序照樣跳出去了。這是為什么呢?
【分析】原因跟上面例子講的一樣,是因為輸入緩沖區中還有數據,所以getchar()會成果讀到數據,所以就跳出了!

------------------
|     【總結】    |
------------------

第一: 要注意不同的函數是否接受空格符、是否舍棄最后的回車符的問題!
讀取字符時:
scanf()以Space、Enter、Tab結束一次輸入,不會舍棄最后的回車符(即回車符會殘留在緩沖區中);
getchar()以Enter結束輸入,也不會舍棄最后的回車符;
讀取字符串時:
scanf()以Space、Enter、Tab結束一次輸入
gets()以Enter結束輸入(空格不結束),接受空格,會舍棄最后的回車符!

第二: 為了避免出現上述問題,必須要清空緩沖區的殘留數據,可以用以下的方法解決:
方法1:C語言里提供了函數清空緩沖區,只要在讀數據之前先清空緩沖區就沒問題了!
       這個函數是fflush(stdin)。
方法2:自己取出緩沖區里的殘留數據。
(說實話這個語句我也沒看懂,呵呵!為什么格式控制是這樣的!希望高手指點一下!)
       scanf("%[^ ]",string);

posted on 2011-05-28 22:08 pp_zhang 閱讀(1447) 評論(0)  編輯 收藏 引用 所屬分類: c/c++

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国产精品久久久久免费a∨大胸 | 免费在线欧美视频| 99人久久精品视频最新地址| 亚洲韩国精品一区| 亚洲欧洲另类国产综合| 一区二区三区自拍| 亚洲欧洲精品一区二区三区波多野1战4 | 亚洲一区二区在线播放| 一本色道久久加勒比精品| 制服丝袜亚洲播放| 欧美一级午夜免费电影| 久久久久久9| 欧美精品在线极品| 国产精品一区2区| 伊人成人在线视频| 99精品视频免费观看| 亚洲欧美日韩国产一区二区| 久久久久久九九九九| 亚洲国内高清视频| 这里只有精品丝袜| 久久免费视频一区| 欧美日韩一区二区三区在线视频 | 午夜欧美电影在线观看| 美日韩精品免费观看视频| 欧美日韩国产成人在线观看| 国产日韩av在线播放| 亚洲区免费影片| 欧美一区二区三区男人的天堂 | 91久久中文字幕| 香港久久久电影| 亚洲国产经典视频| 性欧美18~19sex高清播放| 欧美风情在线| 激情五月婷婷综合| 欧美在线观看网站| 99精品欧美一区二区三区综合在线| 欧美在线免费观看视频| 欧美日韩在线精品一区二区三区| 1769国产精品| 久久另类ts人妖一区二区| 夜夜嗨av一区二区三区网站四季av| 久久久精品国产免费观看同学| 国产精品区一区| 中文一区二区| 亚洲福利视频二区| 鲁大师成人一区二区三区| 国产一区二区三区av电影| 亚洲欧美偷拍卡通变态| 亚洲精品中文字幕女同| 免费人成网站在线观看欧美高清| 国产日韩av在线播放| 先锋影音网一区二区| 亚洲一区bb| 国产精品毛片在线| 1024成人网色www| 免费高清在线一区| 黄色影院成人| 久久亚洲私人国产精品va| 亚洲欧美日韩视频二区| 国产精品一区在线播放| 亚洲自拍偷拍网址| 在线一区二区三区四区| 国产精品裸体一区二区三区| 亚洲男人的天堂在线| 在线亚洲免费| 国产精品裸体一区二区三区| 欧美亚洲免费在线| 欧美一区二区三区四区在线观看地址| 国产欧美日韩视频| 久久本道综合色狠狠五月| 欧美在现视频| 韩日视频一区| 欧美成在线观看| 欧美国产一区二区三区激情无套| 亚洲理伦在线| 亚洲视频欧美视频| 国产亚洲激情| 欧美国产精品劲爆| 欧美日韩在线精品| 欧美在线观看一区| 美女日韩欧美| 正在播放欧美视频| 欧美一级黄色网| 亚洲欧洲偷拍精品| 亚洲视频在线播放| 好吊妞**欧美| 日韩亚洲一区二区| 国产亚洲一级高清| 亚洲第一中文字幕| 国产精品免费福利| 欧美大尺度在线| 国产精品第2页| 免费一级欧美片在线观看| 欧美日本国产精品| 午夜亚洲性色视频| 美女图片一区二区| 午夜精品久久久久久久99黑人| 久久精品一区二区| 亚洲私拍自拍| 久久综合狠狠| 西西裸体人体做爰大胆久久久| 久久综合999| 久久www免费人成看片高清| 欧美fxxxxxx另类| 欧美中日韩免费视频| 欧美精品成人91久久久久久久| 欧美亚洲一区三区| 欧美久久久久免费| 麻豆视频一区二区| 国产精品―色哟哟| 亚洲欧洲视频在线| 亚洲成在人线av| 亚洲欧美亚洲| 亚洲影音一区| 欧美激情一区二区三区在线视频| 欧美在线国产精品| 欧美性淫爽ww久久久久无| 亚洲国产经典视频| 久久狠狠久久综合桃花| 亚洲精品一区中文| 亚洲人精品午夜在线观看| 伊人久久亚洲热| 激情视频一区| 亚洲精品孕妇| 亚洲美女诱惑| 亚洲视频中文字幕| 香蕉亚洲视频| 一本色道久久99精品综合 | 中国亚洲黄色| 欧美一区在线直播| 久久久久久亚洲综合影院红桃| 久久av最新网址| 麻豆九一精品爱看视频在线观看免费| 久久亚洲国产成人| 亚洲国产一区在线| 亚洲免费一在线| 欧美成人xxx| 国产精品亚洲综合久久| 一区二区三区在线视频免费观看| 亚洲毛片在线| 老司机精品久久| 亚洲一区二区毛片| 噜噜噜躁狠狠躁狠狠精品视频| 欧美日一区二区三区在线观看国产免 | 一区二区三区欧美视频| 性xx色xx综合久久久xx| 久久午夜视频| 宅男噜噜噜66一区二区66| 麻豆freexxxx性91精品| 国产女主播一区二区| 亚洲一区二区三区激情| 亚洲国产另类久久精品| 久久精品视频在线看| 亚洲视频网在线直播| 久久中文精品| 亚洲欧美一区二区三区在线 | 亚洲小说区图片区| 欧美日韩国产天堂| 一本色道久久综合亚洲精品高清| 久久久久一区二区三区| 欧美一区二区三区视频在线| 国产精品av免费在线观看| 中文欧美日韩| 中日韩美女免费视频网址在线观看 | 亚洲摸下面视频| 国产精品毛片va一区二区三区| 亚洲一区二区三区乱码aⅴ| aa级大片欧美三级| 国产精品视频一| 欧美在线|欧美| 久久www成人_看片免费不卡| 在线视频日本亚洲性| 国产精品视频免费一区| 久久九九全国免费精品观看| 另类成人小视频在线| 亚洲精品人人| 亚洲欧美日本精品| 亚洲精品专区| 一本久久综合亚洲鲁鲁| 国产亚洲成av人片在线观看桃| 免费在线成人| 国产日本欧美在线观看| 亚洲日本欧美| 亚洲国产精品激情在线观看| 亚洲与欧洲av电影| 亚洲一区二区不卡免费| 久久亚洲私人国产精品va| 午夜精品视频在线观看| 欧美另类综合| 亚洲人成毛片在线播放| 在线免费观看日韩欧美| 国语自产精品视频在线看抢先版结局 | 久久久久久久999| 午夜精彩国产免费不卡不顿大片| 欧美国产一区二区在线观看 | 亚洲视频在线视频| 欧美国产在线观看| 亚洲国产欧美精品| 亚洲高清视频一区二区| 久久成人免费网|