Код продолжает возвращать 255 или -1073741819 при преобразовании char в строку

Это код для преобразования строки в строчные буквы. Я использовал идею о том, что разница значений ASCII между прописными и строчными буквами в алфавите равна 32. Я использую кодовые блоки. Код выполняет преобразование, но выдает эту ошибку. Почему в этом случае я получаю ошибку, хотя нет ошибки при преобразовании строки в char? Как это исправить?

#include<iostream>

using namespace std;

string convertlow (string input )
{
    char letters[255];
    int ascii[255];

     for (int i=0;i<255;i++)
     {
         letters[i]=input[i];
         ascii[i]=(int)letters[i];

         if (ascii[i] < 91)
         {
             ascii[i] = ascii[i] + 32;
             letters[i] = (char) ascii[i];
             input[i] = letters[i];
         }
    }

    return input;
}

int main()
{
    string in;
    cin >> in;

    cout << "The lowercase version is: \n" << convertlow(in);
    return 0;
};

person Owol    schedule 11.08.2018    source источник
comment
Вы, вероятно, получаете доступ к элементам вне диапазона, если ваша строка имеет длину менее 255 символов.   -  person Killzone Kid    schedule 11.08.2018
comment
std::tolower уже существует.   -  person Jesper Juhl    schedule 11.08.2018
comment
как отлаживать небольшие программы. И -1073741819 - это 0xC0000005, что является очень распространенной ошибкой, которую вы можете найти на SO.   -  person phuclv    schedule 11.08.2018


Ответы (1)


Вы должны изменить:

if (ascii[i]<91)
{
    ascii[i]=ascii[i]+32;
    letters[i]= (char)ascii[i];
    input[i]=letters[i];
}

to:

if(ascii[i] >= 'A' && asc[i] <= 'Z')
{
    ascii[i]   = ascii[i]+('a' - 'A');
    letters[i] = (char)ascii[i];
    input[i]   = letters[i];
} 

Но ваша проблема в том, что массив выходит за пределы допустимого диапазона (размер строки должен быть меньше 255). Чтобы решить эту проблему, вы можете изменить свой метод на:

string convertlow (string input ){
    for(int i = 0 ; i < input.size() ; ++i){
        if(islower(input[i]) ){
            input[i] = tolower(input[i]);
        }
    }
    return input;
}

Необходимо включить заголовки: string и algorithm

person Morteza Jalambadani    schedule 11.08.2018
comment
Вы можете упростить последний пример, удалив проверку islower() (это все равно ошибочно, вы хотели использовать вместо нее !islower() или isupper()) и используя std::transform() вместо ручного цикла: std::transform(input.begin(), input.end(), input.begin(), ::tolower); - person Remy Lebeau; 11.08.2018