2012-10-13 3 views
1

Possible Duplicate:
Using strtok with a std::stringerreur: conversion non valide de 'const char *' pour 'char *'

#include<iostream> 
#include <string> 
#include <string.h> 

using namespace std; 

int main() 
{ 
    string s("hello hi here whola"); 
    string background; 
    char *strval; 

    char* tok = strtok_r(s.c_str()," ",&strval); 
    while(tok !=NULL) 
    { 
    cout << tok <<"\n"; 
    if (tok == "&") 
     background = tok; 
    else 
    { 
     statements1; 
     statement2.. ; 
    } 
    tok = strtok_r(NULL, " ",&strval); 
    } 

    return 0; 
} 

sortie:

new.cpp: In function ‘int main()’: 
new.cpp:13:47: error: invalid conversion from ‘const char*’ to ‘char*’ [-fpermissive] 
/usr/include/string.h:359:14: error: initializing argument 1 of ‘char* strtok_r(char*, const char*, char**)’ [-fpermissive] 
+4

pourquoi avez-vous marqué ce C? Avez-vous l'impression que C et C++ sont le même langage? –

+3

C'est vraiment horrible. Choisissez une langue en premier, je recommande C++. – Andro

+2

Pourquoi les utilisateurs l'identifient-ils en tant que c et C++ lorsqu'ils sont en différentes langues? –

Répondre

7

Le s.c_str() renvoie un pointeur sur la const char pour vous empêcher de modifier la sauvegarder la mémoire. Vous devez créer une copie inscriptible de cette chaîne de caractères constante avec la fonction strdup() car strtok() modifie réellement la chaîne que vous recherchez pour les jetons.

+0

Le problème réside dans l'utilisation de la classe de chaînes C++ et du type char * de C ensemble. – Andro

+0

@Andrej Je suis curieux de savoir si le type 'char *' est interdit en C++ :) – Serge

+0

Bien sur que ce n'est pas le cas, mais en mélangeant ces types, le cas donné semble inutile et un peu dangereux. – Andro

1

strtok modifie son argument. Ce n'est pas autorisé avec string.c_str() car il est un const char *

En outre, même si cela a fonctionné votre if(tok == "&") ne fonctionnera pas car Tok est un char *, pas une chaîne, et vous sera donc fait pointeur et non comparaisons de contenu.

Vous devez utiliser strcmp()

Puisque vous utilisez la chaîne, pourquoi ne pas aller cassé et utiliser d'autres C++ construit?

stringstream ss(s); 
string tmp; 
while (ss >> buf) { 
    if(buf == "&") background = buf; // one wonders why 
    cout << buf << '\n'; 
} 
0

Votre code est le mélange string C++ s et cout s avec la fonction C strtok_r. Ce n'est pas une bonne combinaison.

La cause immédiate de votre erreur est que c_str() retourne un const char * tout strtok() demande un non-const char *. Il veut modifier la chaîne que vous transmettez en tant qu'argument et vous n'êtes pas autorisé à modifier la chaîne renvoyée par c_str().

Si vous voulez faire ce C-style, puis basculez s à un char[].

char s[] = "hello hi here whola"; 
int background = 0; 
char *strval; 

char* tok = strtok_r(s, " ", &strval); 
while (tok != NULL) 
{ 
    printf("%s\n", tok); 

    if (strcmp(tok, "&") == 0) 
     background = 1; 
    else 
    { 
     statement1; 
     statement2; 
     ... 
    } 

    tok = strtok_r(NULL, " ", &strval); 
} 
Questions connexes