#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;
}