Comment diviser les chaînes dans vc ++?

J’ai une chaîne “stack + ovrflow * newyork;” je dois diviser cette stack, débordement, newyork

une idée??

D’abord et avant tout, si possible, j’utiliserais toujours boost :: tokenizer pour ce genre de tâche (voir et optimiser les bonnes réponses ci-dessous)

Sans access à stimuler, vous avez deux options:

Vous pouvez utiliser C ++ std :: ssortingngs et les parsingr en utilisant ssortingngstream et getline (le plus sûr)

std::ssortingng str = "stack+overflow*newyork;"; std::issortingngstream stream(str); std::ssortingng tok1; std::ssortingng tok2; std::ssortingng tok3; std::getline(stream, tok1, '+'); std::getline(stream, tok2, '*'); std::getline(stream, tok3, ';'); std::cout << tok1 << "," << tok2 << "," << tok3 << std::endl 

Ou vous pouvez utiliser l'une des fonctions de la famille strtok (voir la réponse de Naveen pour la version agnostique unicode; voir les commentaires xtofls ci-dessous pour des avertissements sur la sécurité des threads), si vous êtes à l'aise avec les pointeurs de caractères

 char str[30]; strncpy(str, "stack+overflow*newyork;", 30); // point to the delimeters char* result1 = strtok(str, "+"); char* result2 = strtok(str, "*"); char* result3 = strtok(str, ";"); // replace these with commas if (result1 != NULL) { *result1 = ','; } if (result2 != NULL) { *result2 = ','; } // output the result printf(str); 

Booster tokenizer

Simple comme ça:

 #include  #include  #include  std::ssortingng ssortingngToTokenize= "stack+ovrflow*newyork;"; boost::char_separator sep("+*;"); boost::tokenizer< boost::char_separator > tok(ssortingngToTokenize, sep); std::vector vectorWithTokenizedSsortingngs; vectorWithTokenizedSsortingngs.assign(tok.begin(), tok.end()); 

Maintenant, vectorWithTokenizedSsortingngs a les jetons que vous recherchez. Notez la variable boost :: char_separator. Il contient les séparateurs entre les jetons.

Voir le tokenizer boost ici .

Vous pouvez utiliser _tcstok pour segmenter la chaîne en fonction d’un délimiteur.

Ce site possède une fonction de marquage de chaîne qui prend une chaîne de caractères à utiliser comme délimiteurs et renvoie un vecteur de chaînes.

Fonction Tokenizer STL Ssortingng simple

Il existe un autre moyen de scinder une chaîne à l’aide de c / c ++:

Commencez par définir une fonction pour diviser une chaîne:

 //pointers of the subssortingngs, assume the number of fields will not be over 5 char *fields[5]; //str: the ssortingng to splitted //splitter: the split charactor //return the real number of fields or 0 if any error exits int split(char* str, char *splitter) { if(NULL == str) { return 0; } int cnt; fields[0] = str; for(cnt = 1; (fields[cnt] = strstr(fields[cnt - 1], splitter)) != NULL && cnt < 5; cnt++) { *fields[cnt] = '\0'; ++fields[cnt]; } return cnt; } 

alors vous pouvez utiliser cette fonction pour scinder la chaîne comme suit:

 char* str = "stack+ovrflow*newyork;" split(str, "+"); printf("%s\n", fields[0]); //print "stack" split(fields[1], "*"); printf("%s\n", fields[0]); //print "ovrflow" split(fields[1], ";"); printf("%s\n", fields[0]); //print "newyork" 

de cette façon sera plus efficace et réutilisable