2016-11-13 8 views
-2

Это моя первая публикация здесь, так что извиняйтесь заранее, если я что-то делаю неправильно. Я работаю над проектом, в котором часть программы должна перевести телефонное слово (IE «Rad-Code») на соответствующие цифры телефона (IE 723-2633). Я пытаюсь использовать оператор switch вместе с функциями члена класса() и length(). Я попытался настроить порядок моего кода для этого раздела, но он продолжает давать мне сообщение об ошибке: «Введите телефонное слово: Rad-Code 723-2633terminate, вызвав после вызова экземпляра« std :: out_of_range », что (): basic_string :: по адресу: __n (что 8)> = this-> размер() (который 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 оператор не проверяет индекс, прежде чем получить доступ к элементу

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), но вы можете упростить это, чтобы предотвратить эти проблемы как так:

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

Это будет безопасно перебрать все значения в phoneWord и вы ее не нужно беспокоиться о доступе к элементам за пределами допустимого диапазона. Он работает безопасно, если есть 4, 8 или 20 символов в phoneWord

 Смежные вопросы

  • Нет связанных вопросов^_^