討論區快速選單
知識庫快速選單
程式設計俱樂部Facebook粉絲團 開發App該選哪個平台? 政府補助!學嵌入式+物聯網
[ 回上頁 ] [ 討論區發言規則 ]
利用stringstream 進行string to int 的多載問題
更改我的閱讀文章字型大小
作者 : redonizuka(Saul)
[ 貼文 12 | 人氣 0 | 評價 0 | 評價/貼文 0 | 送出評價 4 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2014/12/26 上午 06:13:28
程式碼如下:

string quit,check;
    stringstream quittem;
    int number;

    cin>>quit;
    quittem<<quit;

    quittem>>check;
    quittem>>numtem;

    if(check=="c")
     cout<<check<<endl;
    else
     number++;

    quittem.clear();
    quittem.str("");

從網路上我學習到了利用stringstream來進行string轉int,double等數字

但目前我想要有一個功能是,藉由cin來偵測我按的按鈕

比方說 我按C,cout出程式結束,但如果按的是數字,

能接這此數字直接接下去做運算

上面程式碼是我為了要表達我的問題而建立的簡易程式碼

我的疑問及在於

    quittem>>check;
    quittem>>numtem;

是不被允許的,想問不允許的原因

以及是否能有辦法利用strinstream達到此功能

亦或是有其他方法,能供我學習

謝謝
作者 : redonizuka(Saul)
[ 貼文 12 | 人氣 0 | 評價 0 | 評價/貼文 0 | 送出評價 4 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2014/12/26 上午 06:18:14
發文更正,文章內的numtem,已有正確被改成number,只是文章尚未修正,抱歉
作者 : ozzy123(ozzy) 資訊類作業求救卓越專家C++卓越專家貼文超過4000則人氣指數超過30000點
[ 貼文 4464 | 人氣 37262 | 評價 10860 | 評價/貼文 2.43 | 送出評價 49 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2014/12/26 上午 09:47:29
http://blog.csdn.net/joeblackzqq/article/details/7032703
作者 : sflam(Raymond)討論區板主 Visual C++ .NET卓越專家VC++一代宗師新手入門優秀好手資訊類作業求救頂尖高手C++一代宗師貼文超過4000則
[ 貼文 4945 | 人氣 9172 | 評價 32290 | 評價/貼文 6.53 | 送出評價 142 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2014/12/27 上午 10:16:55
>程式碼如下:
>
>string quit,check;
> stringstream quittem;
> int number;
>
> cin>>quit;
> quittem<<quit;

因為 'quit' 已經是 string, 而且 quittem 內部原本也沒有東西, 所以用這個效率會比較好:
  quittem.str(quit);

> quittem>>check;
> quittem>>numtem;
>
> if(check=="c")
> cout<<check<<endl;
> else
> number++;
>
> quittem.clear();
> quittem.str(");
>
>從網路上我學習到了利用stringstream來進行string轉int,double等數字
>
>但目前我想要有一個功能是,藉由cin來偵測我按的按鈕
>
>比方說 我按C,cout出程式結束,但如果按的是數字,
>
>能接這此數字直接接下去做運算
>
>上面程式碼是我為了要表達我的問題而建立的簡易程式碼
>
>我的疑問及在於
>
> quittem>>check;
> quittem>>numtem;
>
>是不被允許的,想問不允許的原因

語法上當然是允許的. 如果 quittem 內的資料是 "C 123", 這兩行在執行上一點問題也沒有:
  quittem.str("C 123");
  quittem >> check;
  quittem >> number;
  std::cout << check << " " << number << std::endl;

問題在於你程式碼的邏輯不符合你想要達到的效果.

因為這兩行:
  std::cin >> quit;
  quittem << quit;

'quittem' 只能存放一個 word, 這個 word 在 quittem >> check 就用掉了. 當執行到
  quittem >> number;
時, quittem 的 buffer 已經沒有東西了, 這個動作導致意圖讀超出 end-of-file, 所以 quittem 物件會設定 eofbit 跟 failbit.

如果你把 'check' 跟 'number' 的次序顛倒:
  quittem >> number;
  quittem >> check;
也無法完美的達到你要的效果. 因為如果 'quittem' 內是 "123", 第一個 quittem >> number 就把它用掉了, 到了第二句的時候還是 eof.

如果 'quittem' 內是 "c", 第一個 quittem >> number 會 fail, 因為 "c" 無法轉換成整數類型. 第二句也不會成功執行, 因為 quittem 已經 fail 了.


>以及是否能有辦法利用strinstream達到此功能

當然有. 一般的做法是先檢查需要做轉換的類型, 如果每個需要做轉換的類型都不會過, 最後就只剩下無法轉換的 command 字串:
  if (quittem >> number)
  {
    std::cout << "value = " << number << std::endl;
  }
  else
  {
    quittem.clear();
    quittem >> check;
    std::cout << "command " << check;
  }


 板主 : Jammy
 > 新手入門 - 討論區
 - 最近熱門問答精華集
 - 全部歷史問答精華集
 - 新手入門 - 知識庫
  ■ 全站最新Post列表
  ■ 我的文章收藏
  ■ 我最愛的作者
  ■ 全站文章收藏排行榜
  ■ 全站最愛作者排行榜
  ■  月熱門主題
  ■  季熱門主題
  ■  熱門主題Top 20
  ■  本區Post排行榜
  ■  本區評價排行榜
  ■  全站專家名人榜
  ■  全站Post排行榜
  ■  全站評價排行榜
  ■  全站人氣排行榜
 請輸入關鍵字 
  開始搜尋
 
Top 10
評價排行
新手入門
1 Raymond 900 
2 BK. 820 
3 Jasper 500 
4 太子 500 
5 Benson 410 
6 joe 400 
7 DEMO999 370 
8 青衫 300 
9 小朱 300 
10 Eric Ho 290 
新手入門
  專家等級 評價  
  一代宗師 10000  
  曠世奇才 5000  
  頂尖高手 3000  
  卓越專家 1500  
  優秀好手 750  
Microsoft Internet Explorer 6.0. Screen 1024x768 pixel. High Color (16 bit).
2000-2018 程式設計俱樂部 http://www.programmer-club.com.tw/
0.03125