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

标签 c++ string iterator

对于作业,我们必须编写一个以多种方式操作 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 不返回 bool。它返回int。保证是,如果字符是字母数字,则返回非零,否则返回零。这意味着您无法将返回值与 true 进行比较,因为该比较会导致 true在比较完成之前转换为 int,产生 1if(isalnum(*marker)) 既是惯用的,也是实际有效的.

    同样,if( checker == true ) 也很臃肿,应该是 if(checker)if (checker == false ) code> 应该是 if(!checker)

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

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

关于c++ - C++ 字符串的迭代器问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28598264/

相关文章:

c# - 如何删除换行符以外的控制字符? (C#)

java - String.replace() 不工作

c++ - 使用 'lower_bound'

python - 在没有mixin的情况下迭代类对象的字典 - python

C++ 创建一个 char* 迭代器

c++ - Win32 - 确定路径是否有可用的巨型图标

c++ - 简单模块系统(回调)

c++ - 将结构传递给函数

java - 使用字符串的 IF 语句

c++迭代破坏二叉树