2016-08-17 42 views
-3

我有下面的代碼,它只需要一個字符串,並找到字母表中的每個字符的索引。爲什麼字符串中的空格使得我的代碼無限循環?

void encrypt() 
{ 
    string alpha = "abcdefghijklmnopqrstuvwxyz"; 
    string word; 
    vector<char> temp; 
    char a, b; 


    cout << "Enter string to encrypt: \n"; 
    cin >> word; 

    for (int i=0; i<word.length(); i++) 
    { 
     bool t = false; 
     a = word[i]; 
     for (int j=0; j<alpha.length(); j++) 
     { 

      b = alpha[j]; 
      if (a == b) 
      { 
       cout << a << "'s index = " << j+1 << endl; 
       t = true; 
      } 
     } 
     if (t == false) 
     { 
      cout << "space here\n"; 
     } 
    } 

} 

當我輸入一個字/串,沒有空間的代碼工作正常,但是當我輸入一個字符串用空格程序進入一個無限循環。

編輯main()中添加由於要求:

main() 
{ 
    int a; 
    bool b = false; 

    while (b == false) 
    { 
     cout << "1. Encrypt a string\n"; 
     cout << "2. Decrypt a string\n"; 
     cout << "3. Exit\n"; 
     cout << endl; 
     cin >> a; 
     cout << endl; 

     if (a == 1) 
     { 
      encrypt(); 
     } 
     else if (a == 2) 
     { 
      decrypt(); 
     } 
     else if (a == 3) 
     { 
      b = true; 
     } 
    } 
    return 0; 
} 
+0

我無法通過調用你的函數從'main'恰好一次重現此錯誤位。請用main顯示一個完整的最小示例。 – merlin2011

+0

請發佈[最小,完整和可驗證示例](http://stackoverflow.com/help/mcve)。 'cin >> word'將只讀到第一個非空白字符後的第一個空白。你如何以及在哪裏輸入了一個空格字符串? – MikeCAT

+0

@ merlin2011 main()添加 –

回答

0

您可以檢查CIN是否完全接受空格分隔字符串,由CIN後立即做了COUT。如果CIN不接受空格分隔字符串,然後嘗試使用函數getline

解決的問題:

使用以下命令:

cout << "Enter string to encrypt: "; 
scanf(" %[^\n]s",word); 

for (int i=0; word[i]!='\0'; i++) 
{ 

使用

include <cstdio> 

希望這能解決問題! !我會回答你的解決方案使用字符串..

+0

cin在讀取空格後沒有讀取空格,但用getline替換後我仍然得到一個無限循環 –

+0

替換爲getline()後,你能** ** cout **完整的字符串與空格嗎? –

+0

是的,然後它進入無限循環 –

1
cin >> word; 

將只讀取第一個單詞,並在輸入流中留下第二個單詞。之後,致電

cin >> a; 

將導致錯誤,除非第二個單詞以數字開頭。一旦程序進入錯誤狀態,就不會讀取任何內容,並且程序停留在循環中。

要診斷這些問題,請務必在讀取操作後檢查流的狀態。

if (cin >> word) 
{ 
    // Use word 
} 
else 
{ 
    // Deal with error. 
} 


if (cin >> a) 
{ 
    // Use a 
} 
else 
{ 
    // Deal with error. 
} 

要解決您的真實問題,請不要使用operator>>來讀取空格分隔的字符串。使用getline(並使用與word不同的變量名稱)。

std::string str; 
if (getline(std::cin, str)) 
{ 
    // Use str 
} 
else 
{ 
    // Deal with error. 
} 

然而,爲了使用getline成功,你必須確保a被讀取後,你忽略該行的其餘部分。否則,該行的其餘部分將被getline讀取。

if (cin >> a) 
{ 
    // Ignore rest of the line 
    cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 

    // Use a 
} 
else 
{ 
    // Deal with error. 
} 
+0

我改變了cin到getline按照建議,但我仍然得到無限循環 –

+0

@nanjeroechizen,看到更新 –

0

cin >> word;替換爲getline(cin, word);。它會接受一行作爲輸入。這將解決你的輸入包含空格。

至於無限循環的關注,清除流cin.clear();