Почему у меня есть исключение вне диапазона, работающее со строками c

#c #string #outofrangeexception

#c #строка #outofrangeexception

Вопрос:

Код получает исключение типа вне диапазона, и я не знаю почему. Кажется, это работает, когда я его отлаживаю, строка преобразуется в то, что я хочу, чтобы это было. Кстати, первый раз при переполнении стека 🙂

 #include <iostream>

using namespace std;

string s;
string alpha = "abcdefghijklmnopqrstuvwxyz";
string crypto(stringamp; s);

int main()
{
    cin >> s;

    cout << crypto(s);

    return 0;
}

string crypto(stringamp; s)
{

    size_t i = 0;
    while (i < s.length()) {
        for (size_t j = 0; j < alpha.length(); j  ) {
            if (s.at(i) == alpha.at(j)) {
                s.at(i) = alpha.at(alpha.length() - 1 - j);
                  i;
            }
        }
    }

    return s;
}
 

Комментарии:

1. Пожалуйста, отформатируйте свой код, чтобы его можно было читать.

2. i не помещается в нужное место. На следующей j итерации у вас может быть доступ вне пределов

3. Я не понимаю. Вы изменяете параметр и возвращаете копию измененного параметра. Обычно функции выполняют одно или другое, а не оба.

Ответ №1:

Подумайте о случае : if s.length() < alpha.length() .

Ответ №2:

Проблема была i в неправильном месте. Вы должны лучше отформатировать свой код, тогда это будет намного легче обнаружить.

Также избегайте непостоянных глобальных переменных и using namespace std :

 #include <iostream>
#include <string> //Include the headers you use

const std::string alpha="abcdefghijklmnopqrstuvwxyz";
void crypto(std::string amp;s);

int main(){

    std::string s;
    crypto(s);
    std::cout<<s;
    return 0;
}

void crypto(std::string amp;s) //If you take the string by reference, it is changed, so you do not have to return it
{   
    for(std::size_t i = 0; i < s.length();   i) { //The for loop avoids the mistake completely
      for(size_t j=0; j < alpha.length();   j){
        if(s.at(i)==alpha.at(j)){
          s.at(i)=alpha.at(alpha.length()-1-j);
        }   
      }
    }
}
 

Чтобы не решить вашу проблему полностью, в коде все еще есть ошибка, которая также была в вашем. Попробуйте найти ошибку самостоятельно.

Ответ №3:

i Не было помещено в нужное место.

Кроме того, в коде есть еще одна проблема: как только элемент был заменен, вы должны немедленно покинуть внутренний цикл ( break ). Если нет, вы можете иметь a -> z -> a в том же цикле.

Ввод

  abcyz
 

Вывод

 zyxba
abcyz
 
 #include <iostream>
#include <string>

std::string crypto(std::stringamp; s) {
    const std::string alpha = "abcdefghijklmnopqrstuvwxyz";
    for (size_t i = 0; i < s.length();   i) {
        for (size_t j = 0; j < alpha.length(); j  ) {
            if (s.at(i) == alpha.at(j)) {
                s.at(i) = alpha.at(alpha.length() - 1 - j);
                break;
            }
        }
    }
    return s;
}

int main() {
    std::string s;
    std::cin >> s;
    std::cout << crypto(s) << std::endl;
    std::cout << crypto(s) << std::endl;
    return 0;
}
 

Ответ №4:

Внутренний цикл crypto функции может увеличиваться i после конца строки. Нет никакого теста, чтобы остановить его.

Вы могли бы избежать этого, выйдя из цикла при изменении буквы (это более правильно и потенциально быстрее). Это означает, что вы должны увеличивать i вне внутреннего цикла, что означает, что внешний цикл for также может быть циклом.

 string crypto(string amp;s) {
  for (size_t i = 0; i < s.length();   i) {
    for (size_t j = 0; j < alpha.length();   j) {
      if (s.at(i) == alpha.at(j)) {
        s.at(i) = alpha.at(alpha.length() - 1 - j);
        break;
      }
    }
  }
  return s;
}