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 语法错误的主要内容,如果未能解决你的问题,请参考以下文章

使用 getline 获取字符串对象

使用 cin.getline(.) 将 char 数组转换为字符串

将换行符 (\n) 添加到 CSV 文件中?

即使我使用字符串空格,也使用 >> 和 getline 获取空输出

字符串输入的几种方式

C++ 中的 Getline 和 cin.ignore