C++ / Указатель(pointer) / передача в функцию (pass to function) forbids comparison between pointer and integer [-fpermissive]

//Преобразование "строки" в "СТРОКУ"

void fFirstF(string ***fSent){
    int nLen = 10; //Потому что nLen = ***fSent.length() не работает
    for(int i = 0; i < nLen; i++){
        if ( ***(fSent + i) >= 'a' && (fSent[i]** <= 'z')){    // ***(fSent + i) ошибка тут
            ***(fSent + i) -= 32;
        }
    }
}

Ответы (1 шт):

Автор решения: KoVadim

По факту, string (если это std::string) это класс, а не голый указатель/массив и к нему нельзя применять адресную арифметику. Для обычных массивов a[b] == *(a+b), а для классов, у которых определен operator[] такое не работает. Собственно об этом компилятор и говорит. Что делать? либо писать так, как того хочет язык с++ (fSent[i]) либо переходить на си или те языки, которые соответствуют Вашим желаниям.

void fFirstF(string& fSent){
    int nLen = fSent.length();
    for(int i = 0; i < nLen; i++){
        if ( fSent[i] >= 'a' && fSent[i] >= 'a'){
           fSent[i] += 22;
        }
    }
}

и сразу видно, что что то пошло не так - условие дублируется.

Посмотрел в код, поправил его максимально сохраняя стиль

void fMain(string *fSent);
void fFirstF(string* fSent) {
    int nLen = 10;
    for(int i = 0; i < nLen; i++){
        if ( (*fSent)[i] >= 'a' && (*fSent)[i] <= 'z'){
             (*fSent)[i] += 22;
        }
    }
}

void fIsQuit(char chIsQuit, string *fSent)
{
    switch (chIsQuit)
    {
        case '1':{
            fFirstF(fSent);
            fMain(fSent);
            break;
        } 
        case 'f':{ return; } 
    }
} 

void fMain(string *fSent) {
    char chAnsw = ' ';
    cin >> chAnsw;
    fIsQuit(chAnsw, fSent);
}

int main()
{
    string sSent = "";
    getline(cin, sSent);
    fMain(&sSent);
}

теперь оно как минимум компилится. Также поправил знак возле 'z'. И понял, почему возникло сколько звездочек - при каждой передаче параметра в новую функцию, почему то появляется амерсанд... не нужно так.

→ Ссылка