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);
 }

私は C++ を初めて使用します。最初のループですべての文字列を取得します。2 番目のループで同じ文字列を出力できれば、取得できません。わかりません

前もって感謝します

4

3 に答える 3

2

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

  1. メモリ管理は自動的に処理され、プログラムによって入力または出力のサイズに任意の制限が課されることはありません。

  2. 古い(そして推奨されていない)Cライブラリ関数を使用しないでください。

  3. 文字列を分割するために元の入力データを変更する必要はありません。つまり、const修飾入力を操作できます。元の入力を変更するため、これはstrtok実行できません。strtok

  4. char *またはchar []バッファがある場合でも、このメソッドを使用できます。これは、このメソッドをに変換できるためですstd::string(null文字で終了していない場合は、コンストラクタにバッファの長さを指定する必要もあります)。

  5. 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;
}
于 2012-05-10T01:20:14.073 に答える
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'
于 2012-05-09T10:06:28.503 に答える
0

使用を開始する前に初期化を試みてくださいi=0。最初のループでは、書く必要がありますMessageBoxA(NULL,strings[i],"stringsComparison",MB_OK);

于 2012-05-09T10:04:53.537 に答える