【发布时间】:2012-04-19 14:51:38
【问题描述】:
当我将 Iterator 附加到字符串时,我遇到了一些意外的字符串行为。基本上,我有一个文件可以读取以下内容:
int x := 10;
print x;
我已经有一个包含此文件内容的字符串,我正在遍历它并立即删除空格。
void Lexer::parse()
{
Pointer = Filestring.begin(); // both private members
while(Pointer < Filestring.end())
{
if(is_whitespace(0)) // 0 indicates current Pointer position
{
advance(Pointer, 1);
continue;
}
CurToken.append(&*Pointer); // CurToken is private member string
advance(Pointer, 1);
}
cout << CurToken << endl;
}
在循环结束时,我希望 CurToken 是一个字符串,它只包含删除了所有空格的字符。相反,我得到如下内容:
int x := 1 + 2;
print x;
nt x := 1 + 2;
print x;
t x := 1 + 2;
print x;
...
rint x;
int x;
nt x;
t x;
x;
;
我认为问题是取消引用指针,如果是这样,我如何附加当前指针位置的字符?如果我不取消引用它,我最终会得到invalid conversion from ‘char’ to ‘const char*’
注意: is_whitespace() 我已经测试过,并且可以按预期工作。因此可以排除可能的问题。
【问题讨论】:
-
你为什么不写
it而不是Pointer而写++it而不是advance(Pointer,1)?另外,为什么不用std::isspace(*it)而不是is_whitespace(0)?你不必要地让它变得复杂。 -
指针是一个字符串迭代器 *
-
*Pointer 返回什么?为什么不能用指针代替 &*Pointer?看起来您可能会在每次循环时附加整个令牌的其余部分 - 而不仅仅是一个字符。
-
正确处理空白。
-
你为什么要为此编写所有这些复杂的非标准代码?在空白处标记文件就像
fstream f("file.txt"); string s; while(f >> s) cout << s << endl;一样简单
标签: c++ string pointers iterator