0

C ++で単語を分割する方法をテストしようとしましたが、非常に不明なエラーに直面しました。この問題は本当に私を狂気に駆り立てます。なぜそれが起こるのかわかりません。

これは私のコードです:

std::string key = "hello world";
std::string word = "";

for (int i = 0; i < (int)key.length(); i++)
{
    if (std::isspace(key[i]) || key[i] == '\0')
    {
        std::cout << word << "\n";
        word.clear();
    }
    else
        word += key[i];
}

結果は「こんにちは」だけです。デバッグして、条件の後に単語が連結を停止する理由を突き止めようとしましたisspaceか? 誰か私に正しい方向を教えてください。

ありがとう

編集済み:次のことを試してみましたが、最後に文字 d がありませんか?

    if (std::isspace(key[i]) || key[i + 1] == '\0')
    {

編集2:これで解決:

    if (std::isspace(key[i]) || key[i + 1] == '\0')
    {
        if (key[i + 1] == '\0')
            word += key[i];
4

2 に答える 2

3

key[j] == 0文字列の長さは終端の 0 をカウントしないため、最後の単語が出力されることはありません。

std::cout << wordそのテストを削除し、ループの後に1 秒追加します。

于 2012-05-30T13:29:28.760 に答える
3

機能しない理由

この条件が満たされることはないため、次のようになります。

key[i] == '\0'

は常にkey.length j() よりも小さく、(理論的には) '\0' 文字は key[key.length()] にあるはずなので、到達することはなく、2 番目の単語を出力しません。

あなたのキーを次のように変更します。

std::string key = "hello world again";

あなたはそれが印刷されるのを見るでしょう

hello
world

しかし、それは印刷されませんagain

C の観点から見ると

C-String (C++ std::string ではない) は '\0' で終了します。
したがって、現在のパスを続けて '\0' 文字を探したい場合は、C-String を使用する必要があります。

これを行うには、 を にfor()変更jでき<=ますkey.length()。ただし、C++ std::string は C-String とは異なることに注意してください。文字 atkey[key.length()]が無効なため、アクセスできません。あなたがすべきことは、C++ std::string を で C-String に変換することですc_str()

    char tmp = key.c_str()[j];
    if (std::isspace(tmp) || tmp == '\0')

あるいは

ループの後に単語を印刷できます(空でない場合)

std::string key = "hello world";
std::string word = "";

for (int j = 0; j < (int)key.length(); j++)
{ 

     if (std::isspace(key[j]) || key[i] == '\0')
     {
           std::cout << word << "\n";
           word.clear();
     }
     else
           word += key[j];
}
if (!word.empty())
{    std::cout << word << "\n";
}
于 2012-05-30T13:37:52.410 に答える