getline()将字符添加到字符串的前面? -- 实际上是 substr 语法错误
Posted
技术标签:
【中文标题】getline()将字符添加到字符串的前面? -- 实际上是 substr 语法错误【英文标题】:getline() Adding Character to Front of String? -- Actually substr syntax error 【发布时间】:2014-02-21 06:58:41 【问题描述】:我正在编写一个平衡化学方程式的程序;我认为这将是一个很好的挑战,并有助于加强我最近学到的信息。
我的程序设置为使用getline(cin, std::string)
接收方程式。从那里它将方程分成两半:左侧和右侧,当遇到=
时创建一个子字符串。
我遇到的问题只涉及我的字符串左侧,称为std::string leftSide
。然后我的程序进入一个 for 循环,该循环在 leftSide
的长度上进行迭代。第一个条件检查字符是否为大写,因为化学式是用元素符号编写的,而符号由一个大写字母或一个大写字母和一个小写字母组成。在检查当前字符是否为大写后,检查下一个字符是否为小写;如果是小写,那么我创建一个临时字符串,将 leftSide[index]
与 leftSide[index+1]
组合到临时字符串中,然后将字符串推送到我的向量。
我的问题在于第一次迭代;我一直在使用 CuFe3 = 8(右侧现在无关紧要)来测试它。 std::string temp
中存储的唯一内容是 C
。我不确定为什么会这样;另外,我的最终答案中仍然有数字,我不明白为什么。一些帮助解决这两个问题,连同解释,将不胜感激。
[代码]
int index = 0;
for (it = leftSide.begin(); it!=leftSide.end(); ++it, index++)
bool UPPER_LETTER = isupper(leftSide[index]);
bool NEXT_LOWER_LETTER = islower(leftSide[index+1]);
if (UPPER_LETTER)// if the character is an uppercase letter
if (NEXT_LOWER_LETTER)
string temp = leftSide.substr(index, (index+1));//add THIS capital and next lowercase
elementSymbol.push_back(temp); // add temp to vector
temp.clear(); //used to try and fix problem initially
else if (UPPER_LETTER && !NEXT_LOWER_LETTER) //used to try and prevent number from getting in
string temp = leftSide.substr(index, index);
elementSymbol.push_back(temp);
else if (isdigit(leftSide[index])) // if it's a number
num++;
[编辑]当我只输入ASDF
时,*** ***S ***DF ***F
是输出。
【问题讨论】:
substr 的签名是string substr (size_t pos = 0, size_t len = npos) const;
因此传递第一个索引和字符数。
另外,如果您不在 for 循环中使用迭代器,则不必在其中使用迭代器。 for(size_t index = 0; index
@dieterlucking 我没有意识到这一点。一旦我可以使用我的电脑,我会更正这一点。我对 C++ 还是很陌生,昨天我刚刚了解了 substr
并遵循了一个教程。
如果它是size_t
,我还能使用索引作为字符串的索引吗?
是的,您应该仍然可以使用它(但我相信您会收到警告)。
【参考方案1】:
string temp = leftSide.substr(index, (index+1));
substr 采用第一个索引,然后是一个长度,而不是第一个和最后一个索引。你想要substr(index, 2)
。因为在您的示例中 index
是 0 您正在执行:substr(index, 1)
创建一个长度为 1 的字符串,即 "C"
。
string temp = leftSide.substr(index, index);
因为index
为0,所以这是substr(index, 0)
,它创建一个长度为0 的字符串,即一个空字符串。
当您处理具有更高索引的字符串部分时,例如"CuFe3"
中的Fe
,您作为长度参数传入的值更高,因此您创建的字符串更长。 F
在索引 2 处,您调用 substr(index, 3)
,这将创建字符串 "Fe3"
。
此外,标准库通常使用半开范围,因此即使 substr 采用两个索引(同样,它没有),您也可以使用 substr(index, index+2)
来获得两个字符串。
bool NEXT_LOWER_LETTER = islower(leftSide[index+1]);
您可能想要检查 index+1
是否是有效索引。如果您不想手动执行此操作,您至少可以切换到使用边界检查函数 at()
而不是 operator[]
。
【讨论】:
谢谢。那么,应该是2
还是index+2
?我在代码中切换到2
,但我学校的防病毒软件不允许我构建应用程序。
@Crysis 关于index+2
的评论通常只是关于标准库对半开范围的使用。 substr()
实际上并不需要两个索引,因此它并不适用于 substr()
。 substr(index, 2)
是唯一正确的方法。
我可能会为substr
和索引编写自己的函数。
@Crysis 好吧,在这种情况下,使用长度而不是结束位置实际上更方便。如果您确实遇到了结束位置更方便的情况,那么我会说去吧。
是的。一个符号最多包含两个字符。以上是关于getline()将字符添加到字符串的前面? -- 实际上是 substr 语法错误的主要内容,如果未能解决你的问题,请参考以下文章
使用 cin.getline(.) 将 char 数组转换为字符串