6
votes

Analyse des chaînes

Si une chaîne peut inclure plusieurs éléments non nécessaires, par exemple, tels que @, #, $,%.

Comment les trouver et les supprimer?

Je sais que cela nécessite une itération de boucle, mais je ne sais pas comment représenter qc comme @, #, $,%.

Si vous pouvez me donner un exemple de code, alors je serai vraiment apprécié.


6 commentaires

Depuis que vous parlez d'une chaîne, je vais supposer que vous voulez dire C ++ et cela le fera du rebut en tant que tel.


Une chaîne signifie la même chose en C aussi.


@James: Je ne pense vraiment pas que vous puissiez faire cette hypothèse.


@Android Eve: Rien n'est moins vrai: std :: string! = Char *


@Android Eve: uniquement aux programmeurs de C qui déteste C ++ parce que ce n'est pas C.


L'important est que la "chaîne" a une signification en C, qu'il a ou non la même signification en C ++.


10 Réponses :


3
votes

Si vous voulez avoir une fantaisie, il y a Boost.regex Sinon, vous pouvez utiliser le Fonction STL Remplacer En combinaison avec le Fonction Strchr ..


0 commentaires

-1
votes

Un caractère est représenté en C / C ++ par guillemets simples, par ex. '@', '#', etc. (à l'exception de quelques-uns qui doivent être échappés).

Pour rechercher un caractère dans une chaîne, utilisez Strchr (). Voici un lien vers un exemple de code:

http://www.cplusplus.com/reference/clibrary/cstring/ Strchr /


2 commentaires

C / C ++ n'est pas une langue, et ce n'est pas la même chose non plus.


Une solution qui fonctionne dans C, fonctionne (généralement) en C ++. L'inverse n'est pas vrai. La réponse que j'ai fournie suggère une solution portable sur C et C ++. VEUILLEZ ÉTENDUER LA PETTTINGS lorsque le sens de ce qui a été écrit est clair.



2
votes

est-ce C ou C ++? (Vous avez étiqueté les deux manières.)

dans Pure C, vous devez très bien boucler le caractère par caractère et supprimer les indésirables. Par exemple: P>

char *buf; 
int len = strlen(buf);
int i, j;

for (i = 0; i < len; i++)
{
    if (buf[i] == '@' || buf[i] == '#' || buf[i] == '$' /* etc */)
    {
        for (j = i; j < len; j++)
        { 
            buf[j] = buf[j+1];
        }
        i --;
    }
}


0 commentaires

3
votes

Et si vous, pour une raison quelconque, devez-le vous faire soi-même de style C, comme cela fonctionnerait:

char* oldstr = ... something something dark side ...

int oldstrlen = strlen(oldstr)+1;
char* newstr = new char[oldstrlen]; // allocate memory for the new nicer string
char* p = newstr; // get a pointer to the beginning of the new string

for ( int i=0; i<oldstrlen; i++ ) // iterate over the original string
    if (oldstr[i] != '@' && oldstr[i] != '#' && etc....) // check that the current character is not a bad one
      *p++ = oldstr[i]; // append it to the new string
*p = 0; // dont forget the null-termination


0 commentaires

2
votes

Algorithme général:

  1. Construisez une chaîne contenant les caractères que vous souhaitez purger: "@ # $%"
  2. Itérale caractère par caractère sur la chaîne d'objet.
  3. Rechercher si chaque personnage se trouve dans l'ensemble de purge.
  4. Si un personnage correspond, jetez-le.
  5. Si un personnage ne correspond pas, appendez-le à une chaîne de résultats.

    Selon la bibliothèque de chaînes que vous utilisez, il existe des fonctions / méthodes qui implémentent une ou plusieurs des étapes ci-dessus, telles que Strchr () ou Rechercher () pour déterminer si un caractère est dans une chaîne.


0 commentaires

1
votes

Utilisez l'opérateur de caractérisateur, c'est-à-dire que a serait 'a' . Vous n'avez pas dit si votre utilisation de cordes C ++ (auquel cas vous pouvez utiliser les méthodes de recherche et de remplacement) ou de cordes dans lesquelles vous utiliseriez quelque chose comme ceci (ceci n'est en aucun cas le meilleur moyen, mais c'est simple. manière): xxx


1 commentaires

Ah, bonne prise, était chose du préprocesseur de Msvc (# @)



1
votes

Vous pouvez utiliser une boucle et appeler wind_last_of ( http://www.cplusplus.com/reference/string/string/find_last_of/ ) Pour rechercher le dernier caractère que vous souhaitez remplacer, remplacez-le par blanc, puis continuez à fonctionner en arrière dans la chaîne. < / p>


0 commentaires


1
votes

Quelque chose comme ça serait: xxx pré>

si votre compilateur prend en charge Lambdas (ou si vous pouvez utiliser Boost), il peut être rendu encore plus court. Exemple Utilisation de Boost :: Lambda: P>

  string str = "a #test #@string";
  str.erase(std::remove_if(str.begin(), str.end(), (_1 == '@' || _1 == '#' || _1 == '$' || _1 == '%')), str.end() );


0 commentaires

3
votes

Je pense que pour cela, j'utiliserais std :: supprimer_copy_if code>: xxx pré>

résultat: p> xxx pré>

Étant donné que les données contenant ces caractères indésirables proviendront normalement d'un fichier de quelque sorte, il convient également d'être envisagé de les débarrasser lorsque vous lisez les données du fichier au lieu de lire les données indésirables dans une chaîne, et puis filtrer le filtrant. Pour ce faire, vous pouvez créer une facette qui classant les caractères indésirables comme espace blanc: p> xxx pré>

Pour l'utiliser, vous immettez le flux d'entrée avec une locale à l'aide de cette facette et Ensuite, lisez normalement. Pour le moment, je vais utiliser un iSTringingStream code>, bien que vous utilisiez normalement quelque chose comme un iStream code> ou ifstream code>: p>

int main() { 
    std::istringstream in("This@is#a$string%with@extra#stuff$to%ignore");
    in.imbue(std::locale(std::locale(), new filter));

    std::copy(std::istream_iterator<char>(in), 
        std::istream_iterator<char>(), 
        std::ostream_iterator<char>(std::cout));

    return 0;
}


0 commentaires