2011-03-08 7 views
1

Possible en double:
Is There A Built-In Way to Split Strings In C++?Comment diviser une chaîne?

j'ai une variable de chaîne qui contient: chaîne var = "this_is.that_alos" comment je peux séparer seulement "that_alos" de lui. -à-dire i besoin que la deuxième partie après "that_alos"

+1

Vous devez être plus précis avec ce que vous veux ... Est-ce que la chaîne aura un seul '.' dedans? Si non, voulez-vous la partie après le premier '.', Le dernier '.', Ou y a-t-il une autre méthode que vous voudriez utiliser? – jswolf19

+1

Et peut-être envisager de supprimer la balise 'C', si vous êtes _really_ en utilisant C++. Ma réponse ci-dessous suppose que C est correct, parce que c'est ce que je connais :) mais si vous voulez vraiment une réponse idiomatique en C++, mettez à jour les tags et je supprimerai ma réponse. Merci – sarnold

+3

Utilisez-vous C ou C++? –

Répondre

3
std::string var = "this_is.that_alos"; 
std::string part = var.substr(var.find_first_of('.')); 

Si vous voulez exclure l''.', il suffit d'ajouter 1:

std::string part = var.substr(var.find_first_of('.') + 1); 
+0

ça marche mais je reçois "." également dans la partie string. comment éviter "." – balaji

+4

@balaji: Voir mes modifications. Je vous recommande fortement de lire la documentation de ces méthodes.C'est une tâche très simple, et avec la moindre recherche, vous auriez pu le résoudre vous-même. –

+4

Je pense qu'en répondant à des questions comme celles-ci, nous sommes en train de faire du tort à l'OP et de nous déchaîner nous-mêmes en libérant de très mauvais programmeurs sans aucune recherche ou capacité de réflexion sur le monde. –

2

En C, la fonction habituelle est strchr(3):

char * second_half = strchr(var, '.'); 

Bien sûr, il s'agit simplement d'un nouveau pointeur vers le milieu de la chaîne. Si vous commencez à écrire dans cette chaîne, elle en modifie la seule et unique copie, également désignée par char *var. (Encore une fois, en supposant C)

0
std::string var = "this_is.that_alos"; 

std::string::iterator start = std::find(var.begin(), var.end(), '.') 
std::string second(start + 1, var.end()); 

Mais vous devriez vérifier si start + 1 n'est pas var.end(), si var ne contiennent aucun point.

+0

'std :: string :: find_first_of' ne retourne pas d'itérateur. –

+0

Vous avez raison, mais je me demande pourquoi, si toutes les autres opérations de recherche renvoient un itérateur? – Fox32

+0

Vous pouvez cependant utiliser 'std :: find'. –

0

Si vous ne souhaitez pas utiliser l'indexation des chaînes ou itérateurs, vous pouvez utiliser std::getline

std::string var = "this_is.that_alos"; 
std::istringstream iss(var); 

std::string first, second; 

std::getline(iss, first, '.'); 
std::getline(iss, second, '.'); 
0

Utilisez strtok pour diviser la chaîne, avec le caractère spécial que « » Ex

string var = "this_is.that_alos"; 
string Parts[5] = strtok(&var[0],"."); 
string SubPart = Parts[1]; 

espère que cela aidera U.

0

La solution la plus simple serait d'utiliser boost :: regex (bientôt std :: regex). Il n'est pas clair quelles sont les exigences exactes, mais elles devraient être faciles à spécifier en utilisant une expression régulière. Sinon (et en utilisant des expressions régulières peut être considéré comme trop pour cela), j'utiliserais les algorithmes habituels, qui fonctionnent pour n'importe quelle séquence. « » Dans ce cas, std :: find trouvera le premier, utiliser avec itérateurs inverse pour trouver le dernier, etc.

- James Kanze