Le découpage d'une chaîne avec strtok_s
Je suis en train de découper une chaîne par un délimiteur spécifié selon cet exemple: http://msdn.microsoft.com/en-us/library/ftsafwz3(v=VS.90).aspx
Mon code compile sans erreur dans Visual C++ 2010, mais lorsque je veux l'exécuter, j'obtiens ce message d'erreur:
Exception non gérée à 0x773a15de dans Test.exe: 0xC0000005: violation d'Accès lecture de l'emplacement 0x00000000.
Voici mon code:
#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <string>
#include <sstream>
#include <regex>
using namespace std;
vector<char *> splitString(char in[])
{
vector<char *> parts(15);
char seps[] = " ,\t\n";
char *next_token1 = NULL;
char *token1 = NULL;
token1 = strtok_s(in, seps, &next_token1);
while ((token1 != NULL))
{
if (token1 != NULL)
{
token1 = strtok_s( NULL, seps, &next_token1);
//printf( " %s\n", token1 );
parts.push_back(token1);
}
}
return parts;
}
int main(int argc, char * argv[])
{
char string1[] =
"A string\tof ,,tokens\nand some more tokens";
vector<char *> parts=splitString(string1);
cout << parts[0] <<endl;
cout << parts[1] <<endl;
return 0;
}
Il semble être illégal que j'essaie d'afficher le vecteur des éléments, mais pourquoi?
Le vecteur de la capacité doit être suffisante et un
printf( "%s\n", token1 );
dans la boucle while imprime les jetons!
- Notez qu'outre le problème avec l'accès non valide adressée par hmjd réponse, vous êtes de jeter le premier jeton.
Vous devez vous connecter pour publier un commentaire.
L'utilisation de
vector
est incorrect. Il est construit avec15
éléments et puispush_back()
est utilisé pour ajouter les chaînes qui ajoute de nouveaux éléments après la période initiale de 15. Cela signifie que le premier15
éléments non affectés (null):Soit:
operator[]
et paspush_back()
(ajouter une autre boucle de terminator pour protéger allant au-delà de la fin du vecteur)(Pensez à changer de
std::vector<std::string>
.)Pour n'en citer que
boost::split()
qui peut produit une liste de tokens (std::vector<std::string>
) à partir d'une chaîne d'entrée et permis de spécification de plusieurs séparateurs.Le problème, c'estUn mot général de prudence: vous êtes à l'aide destrtok
(famille de) fonctions en c++. Notez que cette vieux API modifie c'est de l'argument. Ce n'est souvent pas ce que vous attendez, et pour cette raison, je vous le déconseille l'utilisation de ceC
fonction de la bibliothèque.En outre, vous êtes en supposant que 15 éléments seront lus, laissant le surplus des éléments non initialisée. Cela, aussi, les résultats dans un comportement indéterminé sur l'accès à ces éléments.
Puis-je suggérer une C++ approche, puisque vous l'utilisez:
Il utilise le fait que, par défaut, iostreams sera
skipws
(ignorer les espaces blancs)The trouble is, you're using strtok (family of) functions to modify an unmodifiable string literal.
Il n'y a pas de modification de la chaîne les chaînes de OP du code.string1
est initialisé à partir d'un littéral, ne pointe pas sur les données réelles. Fixation