对于作业,我们必须编写一个以多种方式操作 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
}
最佳答案
isalnum
不返回bool
。它返回int
。保证是,如果字符是字母数字,则返回非零,否则返回零。这意味着您无法将返回值与true
进行比较,因为该比较会导致true
在比较完成之前转换为int
,产生1
。if(isalnum(*marker))
既是惯用的,也是实际有效的.同样,
if( checker == true )
也很臃肿,应该是if(checker)
和if (checker == false )
code> 应该是if(!checker)
。- 您的接口(interface)有问题,因为调用者必须确保 k 的大小足以容纳生成的字符串。最好清除
k
,然后使用push_back()
或类似的方法,而不是迭代器。
假设k.size()
足够大,则*(point++) = *marker;
没有任何问题。
关于c++ - C++ 字符串的迭代器问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28598264/