0

strokC++ を使用して関数を使用してサンプル文字列を分割する必要があります。サンプル文字列は次のとおりです。通常、"This|is||a||sample||string|"これを使用して分割します。strok

#include <stdio.h>
#include <string>
#include <string.h>
using namespace std;

int main()
{   
string  str="This||a||sample||string|";

string a;

str=strtok ((char *)str.c_str(),"|");

while (str.c_str() != NULL)
{
    printf ("str:%s\n",str.c_str());

    str = strtok (NULL, "|");

}

return 0;
}

結果:

str:This

str:a
str:sample

str:string

同じ文字列をに変更すると"This| |a| |sample| |string|"、期待される結果が得られます。

str:This

str: 

str:a

str: 

str:sample

str: 

str:string

文字列を変更せずに期待される結果を得るにはどうすればよいですか?

4

3 に答える 3

4

std::strtokonを使用すると、破壊std::string的であるため、未定義の動作が発生しますstd::strtok(ヒント: return )。std::string::c_str()const char*

代わりに、std::string::findand をstd::string::substr複数回使用します。

#include <iostream>
#include <string>
#include <iterator>

template <class OutputIt>
OutputIt safe_tokenizer(const std::string & s, char token, OutputIt out){
  std::string::size_type pos = 0, f;  
  while((f = s.find(token, pos)) != std::string::npos){    
    *out++ = s.substr(pos, f - pos);
    pos = f + 1;
  }
  if(pos < s.size())
    *out++ = s.substr(pos);
  return out;
}

int main(){
  const std::string str = "Hello|World|How|Are|You";
  safe_tokenizer(str, '|', std::ostream_iterator<std::string>(std::cout, "\n"));
  return 0;
}
于 2013-10-26T11:04:53.963 に答える
1

printf? strtok? あなたはまだCでコーディングしています.Cライブラリは、C++で物事を行うのに(ほとんどの場合)本当に良い方法ではありません.

C++ では、ネイキッド ポインター、C 配列、および C 文字列での操作を避ける傾向がありますが、STL または Boost 機能を使用します。

「実際の C++ での」完全な例については、このスレッドを確認してください。

編集:ここに別のスレッドがあり、さらに優れています。

Edit2: このページの右側を見ると、「関連」列があり、トピックに関する多くの便利なリンクがあります =)

于 2013-10-26T11:08:13.573 に答える
0

strtok 関数を試す

char * TOKEN;
char * mystrtok( char * string,
    const char * control)
{
    char * str=NULL;
    if(string == NULL)
    {
        str = TOKEN;
        if(*str == 0)
        return NULL;
    }
    else
        str = string;

    string = str;
    for ( ; *str ; str++ )
    {
        if(*str == *control)
        {   
            *str++ = '\0';
            break;
        }

    }

    TOKEN = str;
    return string;

}
于 2013-10-26T11:40:05.653 に答える