2 votes

Comment effacer les caractères non alphabétiques d'une chaîne sans dépasser la limite?

Je suis en train d'essayer cette fonction pour retourner sans chiffres, espaces ou autres caractères et je suis censé utiliser la fonction .erase. Je comprends que ma boucle dépasse la portée, mais je n'ai aucune idée de comment la corriger et je suis bloqué sur cela depuis un certain temps. Si l'utilisateur tape "les chiens sont très amusants" et j'ai besoin que la fonction retourne et affiche "leschienssonttrèsamusants" Merci pour l'aide.

#include 
#include 
#include 

using namespace std;

//fonction pour afficher la chaîne sans espaces, chiffres ou ponctuations       
string alphabetOnly (string input){
    int size;
    int i= 0;
    size = (int)input.size();

    while (input[i] < size){
        if (isalpha(input[i])){
            i++;
        }         
        else
            input.erase(input[i]);
    }
    return input;
}

int main() {
    string input;

    cout << "Entrez une chaîne à tester: ";
    getline(cin, input);

    cout << "alphabetOnly: " << alphabetOnly(input) << endl;
}

1voto

9Breaker Points 506

EDITÉ: J'ai été trop hâtif dans ma réponse précédente (comme j'apprends, j'ai besoin de parler à partir de code testé plutôt que de mémoire) et j'ai dû déboguer. Le problème se situe dans le cas else où vous devez effacer le caractère, et NON pas incrémenter i car la longueur de la chaîne a changé, et aussi puisque la longueur de la chaîne a changé, vous devez réinitialiser la taille pour être la nouvelle longueur. Désolé pour la réponse précipitée précédente, je parlais sans avoir réellement utilisé le code compilé.

#include 
#include 
#include 

//function to output string without spaces, numbers, or punctuations
std::string alphabetOnly (std::string input){
    int size;
    int i= 0;
    size = (int)input.size();

    while (i < size){
        if (isalpha(input[i])){
            i++;
        }
        else{
            input.erase(i,1);
            //do not increment i here since the index changed becauase of erase
            size = (int)input.size();
        }
    }
    return input;
}

int main() {
    std::string input;

    std::cout << "Entrez une chaîne à tester : ";
    std::getline(std::cin, input);
    std::cout << input;

    std::cout << "alphabetOnly: " << alphabetOnly(input) << std::endl;

    return 0;
}

entrer la description de l'image ici

0voto

Richard Hodges Points 1972

Quelque chose comme ça :

#include 
#include 
#include 

//fonction pour afficher une chaîne de caractères sans espaces, nombres ou ponctuations        
std::string alphabetOnly (std::string input)
{
    auto not_alpha = [](char c) { return !std::isalpha(c); };
    input.erase(std::remove_if(begin(input), 
                               end(input), 
                               not_alpha), 
                std::end(input));
    return input;
}

int main() {
    std::string input;

    std::cout << "Entrez une chaîne de caractères à tester : ";
    getline(std::cin, input);

    std::cout << "alphabetOnly : " << alphabetOnly(input) << std::endl;
}

http://coliru.stacked-crooked.com/a/340465d41ecd8c8e

0voto

user1876513 Points 51

Il y a plusieurs choses qui ne vont pas avec votre code, mais pour commencer, voici votre erreur principale corrigée.

#include 
#include 
#include 

using namespace std;

//function to output string without spaces, numbers, or punctuations
string alphabetOnly (string input){
int size;
int i= 0;
size = (int)input.size();

while (i < size){
    if(isalpha(input[i]))
    {
        i++;
    }
    else
       input.erase(input.begin( ) + i );
}
return input;
}

int main() {
string input;

cout << "Enter a string to test: ";
getline(cin, input);

cout << "alphabetOnly: " << alphabetOnly(input) << endl;
}

Mais c'est terriblement inefficace car vous décalez tous les caractères non vérifiés restants à chaque suppression.

Vous devriez utiliser quelque chose comme

input.erase( remove_if( input.begin(), input.end(), not( isalpha ) ), input.end( ));

C'est ce qu'on appelle l'idiome remove-erase, que vous pouvez chercher n'importe où.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X