2017-08-23 3 views
-1

Ceci obtient simplement chaque valeur delims d'un tableau de mots appelé inputArray et passe au mot suivant après chaque boucle du temps.C++ enlève la valeur de la fin du caractère

chaque mot est appelé sub. Le problème est qu'une fois qu'un mot avec un 's' est trouvé à la fin, je veux enlever le 's' et faire sub = le nouveau mot.

Ma méthode actuelle transforme le sous-retour en une chaîne appelée stringTemp, puis supprime le 's' et le retourne dans le caractère sub.

char inputDelim[] = " "; 
char* sub = strtok(InputArray, inputDelim); 
while(sub) 
{ 
    //This sets up the ability to find if 's' is at the end of the word 
    int n = strlen(sub); 
    int v = n; 
    char *vw = &sub[0u]; 
    v--; 

    ///////////////////// 
    //The problem is here 
    ///////////////////// 
    if(vw[v] == 's') 
    { 
     string stringTemp = string(sub); 
     stringTemp.erase(stringTemp.end() - 1); 
     sub = str.c_str();//This does not work. Can not convert const char* into char* 
     s = 1; 
     r = 1; 
    } 
    ...lots more code... 
    sub = strtok(NULL, inputDelim); 
} 

est également utilisé dans le code pour différents moyens.

Quelqu'un peut-il aider à faire fonctionner cette méthode, OU me montrer une autre façon que je pourrais supprimer le «s» à la fin du sub char?

Je ne devrais pas être aux prises avec cela, mais malheureusement je le suis.

Merci!

+0

Comment savez-vous que cela ne fonctionne pas? Vous ne faites rien avec la valeur de 'sub'. – interjay

+0

Vous remplacez immédiatement 'sub' de toute façon, avec' sub = strtok (NULL, inputDelim); 'donc ce n'est pas clair pour moi ce que vous essayez d'accomplir –

+0

Le titre de votre question n'a absolument aucun sens! Il n'y a rien comme une fin de char. Les valeurs 'char' sont des entités indivisibles. (Restez loin de 'strtok()' BTW). – user0042

Répondre

0

Il y a un autre problème exactement où vous l'avez dit:

//... 
int v = n; 
char *vw = &sub[0u]; 
v--; 

///////////////////// 
//The problem is here 
///////////////////// 
if(vw[v] == 's') // v points the the NULL char at the end of vw. 

// should read: 
if(vw[v - 1] == 's') // v points the the last char of string vw 

Le principal problème est qu'une fois que vous avez commencé à utiliser strtok sur votre InputArray, vous ne devriez pas salir avec elle. strtok possède à peu près le contenu de votre chaîne, et le modifie même. Votre tentative d'écriture dans sub (qui pointe à l'intérieur de InputArray) casse efficacement la logique interne de strtok.

Vous pourriez avoir enregistré vous-même le bogue irritant en travaillant avec std :: string à partir du get to. strtok() est loin d'être parfait ...

Ce code est pour C++ 03. C++ 11 a introduit std :: find_if_not, et déprécié std :: not1.

#include <string> 
#include <iostream> 
#include <algorithm> 
#include <cctype> 

using namespace std; 

bool is_space(char c) 
{ 
    return isspace(static_cast<unsigned char>(c)) != 0; 
} 

int main() 
{ 
    string no_s; 
    //... 
    string phrase = "hello world and its riches"; 
    string::iterator p1; 
    string::iterator p2 = phrase.begin(); 
    while ((p1 = find_if(p2, phrase.end(), not1(ptr_fun(is_space)))) != phrase.end()) 
    { 
     p2 = find_if(p1 + 1, phrase.end(), is_space); 

     string sub(p1, p2); 
     if (*sub.rbegin() == 's') 
      sub.resize(sub.length() - 1); 

     no_s += sub + " "; 
    } 

    if (no_s.length()) 
     no_s.resize(no_s.length() - 1); 

    cout << no_s; 

    return 0; 
} 
+0

'vw [v]' est le dernier caractère de la chaîne, 'vw [v + 1]' (ie 'vw [strlen (vw)]') est le terminateur nul –

+0

Oh..J'ai manqué le v- -. Trop de variables signifient la même chose dans ce code ... –