2016-11-13 24 views
-2

這是我第一次在這裏發佈,所以如果我做錯了事,我會提前道歉。我正在開發一個項目,其中一部分程序需要將電話號碼(IE「Rad-Code」)翻譯成相應的電話號碼(IE 723-2633)。我試圖在()和length()類成員函數中使用switch語句。我嘗試切換我的代碼的這個部分的順序,但它不斷給我一個錯誤,指出:「輸入電話字:Rad-Code 723-2633terminate在調用'std :: out_of_range'實例後調用什麼( ):basic_string的::在:__N(這是8)> =這個 - >尺寸()(這是8)」在()的類成員函數和帶循環的switch語句

這裏是有問題的代碼:

else if (choice == PHONE_WORD) 
{ 
     cout << "\nEnter the phone word: "; 
     cin >> phoneWord; 
     /*while (phoneWord.length() != 8) 
     { 
      cout << "Please enter a valid phone number length: "; 
      getline(cin, phoneWord); 
     }*/ 

     for (int i = 0; i < phoneWord.length(); i++) 
     switch (phoneWord.at(i)) 
     { 
      case 'A': 
      case 'a': 
      case 'B': 
      case 'b': 
      case 'C': 
      case 'c': 
       cout << "2"; 
       break; 
      case 'D': 
      case 'd': 
      case 'E': 
      case 'e': 
      case 'F': 
      case 'f': 
       cout << "3"; 
       break; 
      case 'G': 
      case 'g': 
      case 'H': 
      case 'h': 
      case 'I': 
      case 'i': 
       cout << "4"; 
       break; 
      case 'J': 
      case 'j': 
      case 'K': 
      case 'k': 
      case 'L': 
      case 'l': 
       cout << "5"; 
       break; 
      case 'M': 
      case 'm': 
      case 'N': 
      case 'n': 
      case 'O': 
      case 'o': 
       cout << "6"; 
       break; 
      case 'P': 
      case 'p': 
      case 'Q': 
      case 'q': 
      case 'R': 
      case 'r': 
      case 'S': 
      case 's': 
       cout << "7"; 
       break; 
      case 'T': 
      case 't': 
      case 'U': 
      case 'u': 
      case 'V': 
      case 'v': 
       cout << "8"; 
       break; 
      case 'W': 
      case 'w': 
      case 'X': 
      case 'x': 
      case 'Y': 
      case 'y': 
      case 'Z': 
      case 'z': 
       cout << "9"; 
       break; 
      case '-': 
       cout << "-"; 
       break; 
      default: 
       cout << "Please enter a valid input: "; 
       break; 
     } 

     cout << phoneWord << " translates to " << phoneWord.at(0) << phoneWord.at(1) << phoneWord.at(2) << phoneWord.at(3) << phoneWord.at(4) << phoneWord.at(5) << phoneWord.at(6) << phoneWord.at(8) << "."; 
} 
+0

這裏是整個程序: –

+1

您不檢查長度:'phoneWord.at(6)<< phoneWord.at(8)'如果字符串是8個字母,有效索引是0-7。你可能會考慮一個循環,它不太容易出錯,並且不計入特定的大小。 –

+0

嗨,感謝您的快速響應。我試圖做一個循環,但我不知道從哪裏開始。我試圖在臨時數組中使用「for」循環,但這可能是我的問題來自的地方。另外,我不小心輸入了8而不是7. 哇,我只是試過了,而且我一定會越來越多。當然還有一些額外的事情需要糾正,但這是一個簡單的忽略。對此,我真的非常感激!我仍在研究這一部分,所以我可能還有一些其他問題。 –

回答

0

這是你的問題:phoneWord.at(8) 。應該是phoneWord.at(7)。

這裏實現你的意圖更簡潔的方式:

// DIGIT_MAP is a static map of characters to digits, 'a' -> 0, 'q' -> 7 etc. 
for (auto it = phoneWord.cbegin(); it != phoneWord.cend(); ++it) 
    cout << DIGIT_MAP[tolower(*it)]; 

無需使用at,這是迭代器是。

0

你會發現,std::vector::at拋出一個異常,如果該指數超出範圍:

它拋出out_of_range如果n是出界。

由於@Retired Ninja points out in the comments:訪問元素

cout << phoneWord << " translates to " << phoneWord.at(0) << phoneWord.at(1) << phoneWord.at(2) << phoneWord.at(3) << phoneWord.at(4) << phoneWord.at(5) << phoneWord.at(6) << phoneWord.at(8) << "."; 

這可能是最後的phoneWord.at(8)本來是phoneWord.at(7)之前,你的最終cout語句不檢查索引,但是你可以簡化這個來防止此類問題像這樣:

std::cout << phoneWord << " translates to "; 
for (auto c : phoneWord) 
    std::cout << c; 
std::cout << "." << std::endl; 

這將通過所有值phoneWord安全迭代和你禾不需要擔心訪問元素超出範圍。如果有4,8或20個字符,它可以安全工作phoneWord