【问题标题】:Iterator woes with C++ stringsC++ 字符串的迭代器问题
【发布时间】:2015-02-19 03:44:53
【问题描述】:

对于一个作业,我们必须编写一个以各种方式操作 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
}

【问题讨论】:

  • 在调试器中运行,逐行执行代码,看看到底发生了什么。

标签: c++ string iterator


【解决方案1】:
  1. isalnum 不返回 bool。它返回int。保证如果字符是字母数字则返回非零值,否则返回零。这意味着您无法将返回值与true 进行比较,因为该比较会导致true 转换为int,从而产生@987654327 @,在比较完成之前。if(isalnum(*marker)) 既惯用又实际有效。

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

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

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

【讨论】:

    猜你喜欢
    • 2011-02-24
    • 2012-02-24
    • 2011-07-22
    • 2012-10-30
    • 1970-01-01
    • 1970-01-01
    • 2015-07-04
    • 2014-09-23
    • 2011-02-13
    相关资源
    最近更新 更多