2012-05-09 10 views
2
char *strings[30]; 
char Policystr[4096] = "the|string|to|split"; 
char delims[] = "|"; 
int i = 0; 

strings[i] = strtok(Policystr, delims) 
while(strings[i] != NULL ) 
{ 
     MessageBoxA(NULL,strings[i],"stringsComparison",MB_OK); 
     strings[++i] = strtok(NULL, delims);   
} 
for (int j = 0; j < i; j++) 
{ 
    MessageBoxA(NULL,strings[j],"strings",MB_OK); 
} 

を分割するためにはstrtokを使用しましたadvance私はCに新しいです++私はYIを知らないで</p> <p>感謝を取得していない午前二ループで同じことを印刷することができる午前た場合、私は最初のループ内のすべての文字列を取得する文字列に

+4

'MessageBoxA(NULL、文字列[j]は、 "stringsComparison"、MB_OK);'正しいことができません。 'j'はトップループ内で決して変化せず、実際にそこにも存在しません。 –

+0

最初のループで 'strings [j]'を 'strings [i]'に変更してみてください。 – aland

+0

C++を使っているなら 'std :: string'と' std :: vector'を使うことができますか? 'std :: string'を分割することは簡単です。特に' boost'がおそらくこの目的のために何かを持っていると考えると、 'boost'がなくても簡単にできるはずです。 – dreamlax

答えて

0

i=0を初期化してから使用を開始してください。あなたはMessageBoxA(NULL,strings[i],"stringsComparison",MB_OK);

+1

ya私は試しました –

2
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

int main(void) 
{ 
    char *strings[30]; 
    char Policystr[4096] = "the|string|to|split"; 
    char delims[] = "|"; 

    int i = 0; 
    strings[i] = strtok(Policystr, delims); 
    while(strings[i] != NULL ) 
    { 
     printf("%d '%s'\n", i, strings[i]); 
     strings[++i] = strtok(NULL, delims);   
    } 

    for (int j = 0; j < i; j++) 
    { 
     printf("%d '%s'\n", j, strings[j]); 
    } 
} 

を記述する必要が最初のループでは出力:

0 'the' 
1 'string' 
2 'to' 
3 'split' 
0 'the' 
1 'string' 
2 'to' 
3 'split' 
+0

この質問はC++のものです。 –

+0

上記のプログラムはC++です。 (私はそれも法的なC.だと信じていますが) –

+0

C++のパンツ(...)は '#include 'など、 'std :: cout'と書いて、' int main() 'と書いて、' std :: string'を使うと主張するかもしれません。 –

1

(悪気、それだけというませんあなたの質問はCタグが付けられ++いますが、1985年からCプログラマのような文字列データを操作しています現在は一般的にstrtokの使用はお勧めしません)。 C++を使用しているので、Cライブラリ関数を避け、代わりにC++標準ライブラリで利用できる機能を使用することをお勧めします。ここには、C++でstd::stringを分割する方法の完全に自己完結型の実例があります。私はC++の初心者ですので、これが最も効率的な方法ではないかもしれません。このアプローチの利点は次のとおりです。

  1. メモリ管理は、プログラムによって入力または出力のサイズに制限されることなく、自動的に処理されます。

  2. 古い(および推奨しない)Cライブラリ関数を使用していません。

  3. 文字列を分割するために元の入力データを変更する必要はありません。これは、const修飾入力を操作できることを意味します。 strtokが元の入力を変更するため、これはstrtokができないものです。

  4. あなたが char *char []バッファを持っている場合、あなたはまだそれがヌル文字で終了されていない場合、あなたはまた、コンストラクタにの長さを与える必要があります( std::stringにそれを回すことができるので、この方法を使用することができます
  5. バッファ)。

  6. ベクトルのstd::stringオブジェクトの1つからメッセージボックスを作成する場合は、.c_str()メンバ関数を使用できます。

    MessageBoxA(NULL, results[i].c_str(), "strings", MB_OK); 
    

#include <string> 
#include <iostream> 
#include <vector> 

int main(void) 
{ 
    std::string delims = "|"; 
    std::string policyStr = "the|string|to|split"; 
    std::vector<std::string> results; 
    size_t lastOffset = 0; 

    while(true) 
    { 
     size_t offset = policyStr.find_first_of(delims, lastOffset); 
     results.push_back(policyStr.substr(lastOffset, offset - lastOffset)); 
     if (offset == std::string::npos) 
      break; 
     else 
      lastOffset = offset + 1; // add one to skip the delimiter 
    } 

    for (size_t i = 0; i < results.size(); i++) 
     std::cout << results[i] << std::endl; 

    return 0; 
} 
関連する問題

 関連する問題