討論區快速選單
知識庫快速選單
政府補助!學嵌入式+物聯網 網路投保旅行平安險
[ 回上頁 ] [ 討論區發言規則 ]
[討論]get , getline, 一般cin輸入
更改我的閱讀文章字型大小
作者 : clockwork(發條盒子) C++優秀好手貼文超過200則人氣指數超過70000點
[ 貼文 480 | 人氣 72923 | 評價 790 | 評價/貼文 1.65 | 送出評價 43 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2006/7/2 下午 04:25:38
手上有一份ppt
希望可以分享給大家
http://moon.cse.yzu.edu.tw/~s932361/Inputstream.ppt
希望對輸入方面有問題的人可以參考一下^^

另外就是我想問一下問題
int main()
{
char str[20];
char numb[20];
cout << "numb" << endl;
cin.getline(numb, 20);
cout << "str" << endl;
cin.getline(str, 20);
cout << endl;
cout << numb << endl;
cout << str << endl;
return 0;
} // end main
為什今天我寫這樣的練習的時候當我資料輸入超過20個字母含空格之後,我第二個str就不用輸入了,自動跳過??以理論上來說,不是第一個getline會把istream裡面前19個字元輸入進去,在第二次的getline的時候才會把剩下的又自動取進去,結果怎麼連取進去都沒有完完全全沒東西??

而我用get的話才有我剛剛說的結果呢?才會有多輸入的自動填入str中
我希望做到用getline就算多輸入超過大小的話他也會刪除後面的istream的資料,我知道使用cin.ignore()
而且不會跳過下一個輸入~~
我現在的情況是當我第一個資料輸入完,只要超過大小20就馬上結束輸入了,我第二個資料都還沒有輸入,讓我很傻眼,那也不用ignore()了直接跳過了。
作者 : justdotw(workman) C++ Builder卓越專家C++優秀好手貼文超過200則
[ 貼文 298 | 人氣 1298 | 評價 3280 | 評價/貼文 11.01 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2006/7/2 下午 09:40:27
MSDN對於getline有這麼一行描述:
if the function extracts no elements or _Count - 1 elements, it calls setstate(failbit).
因此,推測是cin的旗標被設定成 failbit ,故無法繼續擷取字元
你可以嘗試在下一行接著清除所有的錯誤旗標
ex: cin.clear();
作者 : clockwork(發條盒子) C++優秀好手貼文超過200則人氣指數超過70000點
[ 貼文 480 | 人氣 72923 | 評價 790 | 評價/貼文 1.65 | 送出評價 43 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2006/7/3 下午 12:39:48
看完一些文件,好像使用std::string是最佳的解決辦法了

文件上所說的

string str;
getline(cin, str);

它的getline是一個friend function嗎?不是只有cin.getline才有這個成員函式嗎?
怪怪的getline(cin, str);不太了解是什麼意思。
但是看完不少教學文章,好像都建議使用string標準物件
作者 : clockwork(發條盒子) C++優秀好手貼文超過200則人氣指數超過70000點
[ 貼文 480 | 人氣 72923 | 評價 790 | 評價/貼文 1.65 | 送出評價 43 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2006/7/3 下午 01:41:28
呼~~經過超過37小時的沒有睡,已經找到根本的解決辦法了,順便貼出來不知道對大家有沒有幫助

void my_getline(char*, int);
int main()
{
char name[20];
char num[20];


cout<<"input 1:";
my_getline(name, 20);

cout<<"input 2:";
my_getline(num, 20);

cout << name << endl;
cout << num << endl;
cout<<"end input!\n";
return 0;
}
void my_getline(char* source, int size)
{
cin.getline(source, size);
if (cin.bad())//判斷是否錯誤發生
{
cin.clear();//清除錯誤
while (cin.get() != '\n'); //使用get()把剩下所有出現在istream資料全吃掉,當執行判斷的時候cin.get()先執行,所以也吃掉'\n',剩下的istream就空空的了
}
}
這樣不論資料輸入多還是少都可以非常正常的運行
作者 : sflam(Raymond)討論區板主 Visual C++ .NET卓越專家VC++一代宗師新手入門優秀好手資訊類作業求救頂尖高手C++一代宗師貼文超過4000則
[ 貼文 4945 | 人氣 9172 | 評價 32290 | 評價/貼文 6.53 | 送出評價 142 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
主題發起人clockwork註記此篇回應為最佳解答 2006/7/3 下午 10:50:00
>int main()
>{
> char str[20];
> char numb[20];
> cout << "numb" << endl;
> cin.getline(numb, 20);
> cout << "str" << endl;
> cin.getline(str, 20);
> cout << endl;
> cout << numb << endl;
> cout << str << endl;
> return 0;
>} // end main
>為什今天我寫這樣的練習的時候當我資料輸入超過20個字母含空格之後,我第二個str就不用輸入了,自動跳過??以理論上來說,不是第一個getline會把istream裡面前19個字元輸入進去,在第二次的getline的時候才會把剩下的又自動取進去,結果怎麼連取進去都沒有完完全全沒東西??


你不是有這本書嗎?

  The C++ Standard Library, Nicolai Josuttis

第 608 頁, istream& istream::getline(char *str, streamsize count)

  "if they read lines with more than count-1 characters, they set failbit."

再看第 599 頁, 後面算起第二段:

  "Note that you always have to clear error bits explicitly. In C it was possible to read characters after a format error. ... this is different in C++. if failbit is set, each following stream operation is no-op until failbit is cleared explicitly."


>看完一些文件,好像使用std::string是最佳的解決辦法了

通常是.


>文件上所說的
>
>string str;
>getline(cin, str);
>
>它的getline是一個friend function嗎?

它是一個 global function. 完整的名字是: std::getline().


>不是只有cin.getline才有這個成員函式嗎?

這是 std::istream 的成員函式.



>呼~~經過超過37小時的沒有睡,

這不太健康 ^^


む略め

>void my_getline(char* source, int size)
>{
> cin.getline(source, size);
> if (cin.bad())//判斷是否錯誤發生
> {
> cin.clear();//清除錯誤
> while (cin.get() != '\n'); //使用get()把剩下所有出現在istream資料全吃掉,當執行判斷的時候cin.get()先執行,所以也吃掉'\n',剩下的istream就空空的了
> }
>}

可以更簡單一點:

  void my_getline(char* source, int size)
  {
    if (!cin.getline(source, size))
    {
      cin.clear();
      cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    }
  }

cin.getline() 傳回一個 cin 的物件. std::ios_base 內有超載 operator!, 等于直接呼叫 fail().

作者 : clockwork(發條盒子) C++優秀好手貼文超過200則人氣指數超過70000點
[ 貼文 480 | 人氣 72923 | 評價 790 | 評價/貼文 1.65 | 送出評價 43 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2006/7/3 下午 11:30:05
原來如此,這樣也行,我都沒有去翻那本書^^因為放在中壢

不過還有這樣簡單的寫法,實在太神了
不過上面的寫法我也是想破頭才想出來的嗚~~~
作者 : clockwork(發條盒子) C++優秀好手貼文超過200則人氣指數超過70000點
[ 貼文 480 | 人氣 72923 | 評價 790 | 評價/貼文 1.65 | 送出評價 43 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2006/7/4 下午 07:18:39

>可以更簡單一點:
>
>  void my_getline(char* source, int size)
>  {
>    if (!cin.getline(source, size))
>    {
>      cin.clear();
>      cin.ignore(std::numeric_limits<std::streamsize>::max(), ''
'');
>    }
>  }
>
>cin.getline() 傳回一個 cin 的物件. std::ios_base 內有超載 operator!, 等于直接呼叫 fail().
>
這樣的意思是不是說如果getline()不成功的話badbit set or failbit set 所以先清除clear()flag中的錯誤,之後使用ignore()把istream裡面所有料全都清掉或直到遇到'\n'這樣嗎?因為我手上沒有帶那本std所以std::numeric_limits<std::streamsize>max()這個要去那裡查阿,我都查不到
作者 : sflam(Raymond)討論區板主 Visual C++ .NET卓越專家VC++一代宗師新手入門優秀好手資訊類作業求救頂尖高手C++一代宗師貼文超過4000則
[ 貼文 4945 | 人氣 9172 | 評價 32290 | 評價/貼文 6.53 | 送出評價 142 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2006/7/4 下午 11:19:52
>這樣的意思是不是說如果getline()不成功的話badbit set or failbit set 所以先清除clear()flag中的錯誤,

是.

>之後使用ignore()把istream裡面所有料全都清掉或直到遇到'\n'這樣嗎?

http://msdn2.microsoft.com/en-us/library/3w23zf49.aspx

一直 ignore 到找到第二個 argument 設定的字元, 然後把那個字元也清掉.


>因為我手上沒有帶那本std所以std::numeric_limits<std::streamsize>max()這個要去那裡查阿,我都查不到
>

書裡就有這個使用的例子.

MSDN 有 numeric_limits 的章節, 但書本教得比較清楚.

  http://msdn2.microsoft.com/en-us/library/34stz20a.aspx

作者 : clockwork(發條盒子) C++優秀好手貼文超過200則人氣指數超過70000點
[ 貼文 480 | 人氣 72923 | 評價 790 | 評價/貼文 1.65 | 送出評價 43 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2006/7/5 上午 02:05:14
太好了,明天做一趟火車去中壢拿回我的書^^
 板主 : simula
 > C++ - 討論區
 - 最近熱門問答精華集
 - 全部歷史問答精華集
 - C++ - 知識庫
  ■ 全站最新Post列表
  ■ 我的文章收藏
  ■ 我最愛的作者
  ■ 全站文章收藏排行榜
  ■ 全站最愛作者排行榜
  ■  月熱門主題
  ■  季熱門主題
  ■  熱門主題Top 20
  ■  本區Post排行榜
  ■  本區評價排行榜
  ■  全站專家名人榜
  ■  全站Post排行榜
  ■  全站評價排行榜
  ■  全站人氣排行榜
 請輸入關鍵字 
  開始搜尋
 
Top 10
評價排行
C++
1 Raymond 13050 
2 青衫 4760 
3 simula 4690 
4 coco 4030 
5 白老鼠(Gary) 3670 
6 ozzy 2540 
7 Ben 2250 
8 Anderson 1960 
9 windblown 1650 
10 Kenny 1560 
C++
  專家等級 評價  
  一代宗師 10000  
  曠世奇才 5000  
  頂尖高手 3000  
  卓越專家 1500  
  優秀好手 750  
Microsoft Internet Explorer 6.0. Screen 1024x768 pixel. High Color (16 bit).
2000-2019 程式設計俱樂部 http://www.programmer-club.com.tw/
0.171875