2014-09-10 84 views
2

我有這樣的代碼:C++遞歸重複輸出

#include <iostream> 
#include <vector> 
#include <ctime> 
#include <math.h> 
#include <string> 

using namespace std; 

int main() 
{ 
    srand(time(0)); 
    string command_one; 
    int slot; 
    cout<<"One chip or Quit?\n"; 
    getline(cin, command_one); 
    if(command_one=="One chip"){ 
     cout<<"Pick a slot between 0 and 8 (inclusive)\n"; 
     cin>>slot; 
     if(slot>=0 and slot<=8){ 
      double position=slot; 
     } 
     else{ 
      cout<<"This Option is invalid!\n"; 
      main(); 
     } 
    } 
    else if(command_one=="Quit"){ 
     cout<<"Have a nice day! :D"; 
    } 
    else{ 
     cout<<"This Option is invalid!\n"; 
     main(); 
    } 
} 

當它擊中嵌套在if(command_one ==「單芯片」),它返回

「這個選項是無效的其他環
! 單芯片,多芯片或退出?
此選項無效!
單芯片,多芯片或退出?

但它應該是:

「此選項無效!
單芯片,多芯片或退出?」

這怎麼解決?

+0

照顧'\ n'。 – haccks 2014-09-10 15:29:24

+0

不要遞歸到'main'?通常你會爲此創建一個新的函數,並從'main'調用它。 – crashmstr 2014-09-10 15:29:48

+0

將遞歸功能提取到其他方法,不要使用'main'進行遞歸。順便說一句:「雙重位置=插槽;」不要做任何事情。 – NetVipeC 2014-09-10 15:29:59

回答

0

cin不接受\n字符。 getline()將其作爲空行輸入。把一個getchar()採取\n字符。

#include <iostream> 
#include <vector> 
#include <ctime> 
#include <math.h> 
#include <string> 
#include <stdio.h> 

using namespace std; 

int main() 
{ 
    string command_one; 
    int slot; 
    cout<<"One chip or Quit?\n"; 
    getline(cin, command_one); 
    if(command_one=="One chip") 
    { 
     cout<<"Pick a slot between 0 and 8 (inclusive)\n"; 
     cin>>slot; 

     //putting a getchar() after cin 

     getchar(); 
     if(slot>=0 and slot<=8) 
     { 
      double position=slot; 
     } 
     else 
     { 
      cout<<"This Option is invalid!\n"; 
      main(); 
     } 
    } 
    else if(command_one=="Quit") 
    { 
     cout<<"Have a nice day! :D"; 
    } 
    else 
    { 
     cout<<"This Option is invalid!\n"; 
     main(); 
    } 
} 
+0

getchar()如何工作? – user3843986 2014-09-13 16:16:20

+0

當你從鍵盤輸入數字並按下輸入新行字符'\ n'也被採用,這就是爲什麼你的程序產生兩次輸出,但在函數getchar()函數後面放置一個getchar()函數需要新行字符'\ n'並且程序只產生一次輸出... – 2014-09-14 04:45:29

1
cin>>slot; 

這會在流的緩衝區中留下數字後面的換行符。下一個電話getline會發現,給出一個空行。

您可以使用ignore忽略新行字符,並在該行的末尾任何其他垃圾:

cin.ignore(-1, '\n'); // ignore any number of characters up to and including new-line 

請注意,調用main是不允許的(儘管一些編譯器可能允許的話);像這樣無限遞歸最終會導致堆棧溢出。考慮使用循環代替。

0

std::getline:從輸入

提取字符,並將其追加到str,直到以下情況之一發生在輸入
一個)結束文件狀態,(按所列順序選中)在這種情況下,getlineeofbit
b)通過Traits::eq(c, delim)測試,下一個可用的輸入字符是delim,在這種情況下,分隔字符是從輸入中提取的,但不會附加到str

因此,您需要消耗剩餘的\n字符。