すべての区切り文字でこれを機能させるにはどうすればよいですか?- C++

StackOverflow https://stackoverflow.com/questions/2219690

  •  19-09-2019
  •  | 
  •  

質問

ポインターを使用して char 配列をトークン化するプログラムを作成しました。プログラムは区切り文字としてスペースを扱うだけで済みました。提出して全額クレジットを取得しましたが、提出後にこのプログラムが のみ 区切り文字がスペースの場合に機能しました。

私の質問は、このプログラムをすべての区切り文字で動作させるにはどうすればよいでしょうか?

以下に示す関数は、char 配列内の次の単語へのポインターを返します。すべての区切り文字を処理するには、これを変更する必要があると思います。

ありがとう!

コード:

char* StringTokenizer::Next(void)
{
pNextWord = pStart;

if (*pStart == '\0') { return NULL; }

while (*pStart != delim)
{
    pStart++;
}

if (*pStart == '\0') { return NULL; }

*pStart = '\0';
pStart++;

return pNextWord;
}

メインの印刷ループ:

// this loop will display the tokens
while ( ( nextWord = tk.Next ( ) ) != NULL )
{
    cout << nextWord << endl;
}
役に立ちましたか?

解決

最も簡単な方法は、

while (*pStart != delim)

のようなものに

while (*pStart != ' ' && *pStart != '\n' && *pStart != '\t')

または、delim を文字列にして、文字列に文字が含まれているかどうかをチェックする関数を作成することもできます。

bool isDelim(char c, const char *delim) {
   while (*delim) {
      if (*delim == c)
         return true;
      delim++;
   }
   return false;
}

while ( !isDelim(*pStart, " \n\t") ) 

あるいは、おそらく最良の解決策は、これらすべてを行うために事前に構築された関数の 1 つを使用することです。 ストラトーク.

他のヒント

ただ変えるだけ

while (*pStart != delim)

この行まで

while (*pStart != '\0' && strchr(" \t\n", *pStart) == NULL)

標準 strchr 関数(で宣言されています) string.h header) は、C 文字列 (最初の引数として指定) 内の文字 (2 番目の引数として指定) を検索し、その文字が最初に出現する位置から文字列へのポインタを返します。それで strchr(" \t\n", *pStart) == NULL 現在の文字 (*pStart) が文字列内に見つかりません " \t\n" それは区切り文字ではありません!(この区切り文字列を変更してください " \t\n" もちろん、ニーズに合わせて調整するためです。)

この解決策は、指定された興味深い文字のセット (通常は小さい) の中に指定された文字があるかどうかをテストする、短くて簡単な方法です。そしてそれは標準機能を使用します。

ちなみに、これはC文字列だけでなく、 std::string あまりにも。必要なのは宣言することだけです const std::string" \t\n"-like 値を使用して置換します strchrfind 宣言された区切り文字列のメソッド。

うーん...これはかなり右を見ていません。

if (*pStart = '\0')

条件が真であることはできません。私はあなたが==代わりの=を意図推測していますか?また、ここで問題のビットを持っています:

while (*pStart != delim)
文字列の最後の言葉は、区切り文字が続いていない場合は、

、これは深刻な問題が発生します、文字列の末尾をオフに実行しようとします。

編集:あなたが本当に自分でこれを実行する必要がある場合を除き、仕事のためにstringstreamを使用することを検討してください。これは、すでに内のすべての権利機構を有し、非常に重くテスト。これは、オーバーヘッドを追加しないが、それは多くのケースでは非常に許容できるのです。

コンパイルされません。しかし、私はこのような何かをしたい。

 //const int N = someGoodValue;
char delimList[N] = {' ',',','.',';', '|', '!', '$', '\n'};//all delims here.

char* StringTokenizer::Next(void)
{
    if (*pStart == '\0') { return NULL; }

    pNextWord = pStart;

    while (1){  
        for (int x = 0; x < N; x++){
            if (*pStart == delimList[x]){ //this is it.
                *pStart = '\0';
                pStart++;
                return pNextWord;
            }

        }
        if ('\0' == *pStart){ //last word.. maybe.
                return pNextWord;   
        }
        pStart++;
    }
}

// (!compiled).

私たちはCではなくC ++に固執することを前提としています。機能strspnstrcspnがセット区切り文字でトークン化に適しています。次分離が始まるどこで見つけるためにstrspnを使用することができる(すなわち、現在のトークンが終了する)と、次に検索するためstrcspnを使用してここでセパレータの端部(すなわち、次のトークンが始まります)。あなたが最後に到達するまでループます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top