C++ 字符串的迭代器问题

Iterator woes with C++ strings

对于一项作业,我们必须编写一个以多种方式处理 C++ 字符串的大型程序。它的大部分都在工作,但是这个特殊的功能让我很困惑。我试图循环遍历一个字符串并在第一个字母数字字符出现之前删除所有非字母数字(制表符、空白换行符)字符,然后在第一个非字母数字字符再次出现时结束字符串。例如,“bob jon”将保存为 "bob"。每个字符串都被认为是空的,出了点问题。大多数同行都说

*(point++) = *marker;

无法完成,我应该在尝试其他任何事情之前更改它...这是一种在将迭代器的值分配给另一个迭代器的值的同时递增迭代器的方法吗?是这个问题还是其他原因?

void clean_entry( const string& j, string& k )
{
    string::iterator point = k.begin();
    bool checker = false;
    //cycle through the constant string and check for numbers and letters
    for(string::const_iterator marker = j.cbegin(); marker!=j.cend(); ++marker)
    {
        if( isalnum(*marker) == true )
        {
           *(point++) = *marker; //copy to the new k string if alphanum, and increment iterator
            cout << "I found a real letter!" << endl; //debugging
            checker = true;
        }
        else if( checker == true )
            break;
    }
    cout << "So far we have " << k << endl; //debugging
    if (checker == false )
        k = "(empty word)";

    cout << "The new string is " << k << " apparently." << endl; //debugging
}
  1. isalnum 没有 return bool。它 returns int。如果字符是字母数字,则保证 return 非零,零 otherwise.This 意味着您无法将 return 值与 true 进行比较,因为该比较会导致 true 转换为 int,在比较完成之前产生 1if(isalnum(*marker)) 既符合惯用语,也确实有效。

    同样,if( checker == true )臃肿,应该是if(checker)if (checker == false )应该是if(!checker).

  2. 您的接口有问题,因为调用者必须确保 k 的大小足以容纳结果字符串。最好清除 k 然后使用 push_back() 或类似的而不是迭代器。

假设k.size()足够大,*(point++) = *marker;没有问题。