user63898
user63898

Reputation: 30885

tring to convert str string for use in std::getline delimiter

im trying to take std::string value and use it as delimiter in std::getline() function but no mater what i do the compiler gives me error. this is what im trying to do :

std::stringstream ss(s);
    std::string item;
    std::string delim ="&&=";
    int ssize = delim.size();
    int newssize = ssize+1;
    char del[SSIZE];  // also here when i try gives error
    strcpy(del,delim.c_str());

        char * delrr[1024] = delim.c_str();  //gives error 

        while(std::getline(ss,item,delrr)) {
           elems.push_back(item);
    }

the error im getting is always about const char* convertion .

 error C2440: 'initializing' : cannot convert from 'const char *' to 'char *[1024]'
1>        There are no conversions to array types, although there are conversions to references or pointers to arrays
1>.\UT.cpp(179) : error C2780: 'std::basic_istream<_Elem,_Traits> &std::getline(std::basic_istream<_Elem,_Traits> &,std::basic_string<_Elem,_Traits,_Alloc> &)' : expects 2 arguments - 3 provided
1>        d:\Program Files\Microsoft Visual Studio 9.0\VC\include\string(527) : see declaration of 'std::getline'
1>.\UT.cpp(179) : error C2784: 'std::basic_istream<_Elem,_Traits> &std::getline(std::basic_istream<_Elem,_Traits> &,std::basic_string<_Elem,_Traits,_Alloc> &,const _Elem)' : could not deduce template argument for 'std::basic_istream<_Elem,_Traits> &' from 'std::stringstream'
1>        d:\Program Files\Microsoft Visual Studio 9.0\VC\include\string(475) : see declaration of 'std::getline'
1>.\UT.cpp(179) : error C2784: 'std::basic_istream<_Elem,_Traits> &std::getline(std::basic_istream<_Elem,_Traits> &,std::basic_string<_Elem,_Traits,_Alloc> &,const _Elem)' : could not deduce template argument for 'std::basic_istream<_Elem,_Traits> &' from 'std::stringstream'
1>        d:\Program Files\Microsoft Visual Studio 9.0\VC\include\string(475) : see declaration of 'std::getline'
1>.\UT.cpp(179) : error C2782: 'std::basic_istream<_Elem,_Traits> &std::getline(std::basic_istream<_Elem,_Traits> &,std::basic_string<_Elem,_Traits,_Alloc> &,const _Elem)' : template parameter '_Elem' is ambiguous
1>        d:\Program Files\Microsoft Visual Studio 9.0\VC\include\string(475) : see declaration of 'std::getline'
1>        could be 'char **'
1>        or       'char'

UPDATE:
found the answer: How do I tokenize a string in C++?
http://www.codeproject.com/Articles/23198/C-String-Toolkit-StrTk-Tokenizer

Upvotes: 11

Views: 2348

Answers (2)

user1157391
user1157391

Reputation:

The third argument of getline() is a char, not a char array. See this. You cannot use this function if you need multiple delimiters or a delimiter made of multiple characters.

Use find() and substr().

Upvotes: 3

Timo Geusch
Timo Geusch

Reputation: 24341

std::string::c_str() gives you a pointer to a character array. In order to fill a character array with the results of the call to c_str() you'll need to use strcpy() or strncpy() as those actually copy the C style string.

Also, you've declared delrr as an array of 1024 character pointers rather than 1024 characters, is that really the intent?

Upvotes: 3

Related Questions