Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ getline()正在向字符串前面添加字符?--实际上是substr语法错误_C++_String_Stdstring - Fatal编程技术网

C++ getline()正在向字符串前面添加字符?--实际上是substr语法错误

C++ getline()正在向字符串前面添加字符?--实际上是substr语法错误,c++,string,stdstring,C++,String,Stdstring,我正在写一个平衡化学方程式的程序;我认为这是一个很好的挑战,有助于巩固我最近学到的信息 我的程序设置为使用getline(cin,std::string)来接收公式。从那里,它将方程分成两半:当遇到=时,通过生成一个子字符串将方程分为左侧和右侧 我遇到的问题只涉及字符串的左侧,称为std::string leftSide。然后,我的程序进入一个for循环,循环长度为leftSide。第一个条件检查字符是否为大写,因为化学公式是用元素符号书写的,符号由一个大写字母或一个大写字母和一个小写字母组成。

我正在写一个平衡化学方程式的程序;我认为这是一个很好的挑战,有助于巩固我最近学到的信息

我的程序设置为使用
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++;

    }
[EDIT]当我只在
ASDF
中输入时,
*****S******DF***F
是输出

substr获取第一个索引和一个长度,而不是第一个和最后一个索引。您需要
substr(索引,2)
。因为在您的示例中,
index
是0,所以您正在执行:
substr(index,1)
创建长度为1的字符串,即
“C”

由于
index
是0,这就是
substr(index,0)
,它创建了一个长度为0的字符串,即空字符串

当您处理索引较高的字符串部分时,例如
中的
Fe
“CuFe3”
中的
Fe,作为长度参数传入的值较高,因此您创建的字符串较长
F
位于索引2,您可以调用
substr(索引,3)
,这将创建字符串
“Fe3”

此外,标准库通常使用半开范围,因此即使substr使用两个索引(同样,它没有),您也可以使用
substr(索引,索引+2)
来获得一个两个字符的字符串


您可能需要检查
索引+1
是否为有效索引。如果您不想手动执行此操作,您至少可以切换到使用边界检查函数
at()
而不是
运算符[]

substr的签名是
string substr(size\t pos=0,size\t len=npos)const子字符串< /> >并遵循教程。如果代码,我仍然能够使用索引的字符串吗?是的,你仍然可以使用它(但是你会得到一个我相信的警告)。谢谢。那么,它应该是
2
还是
index+2
?我在代码中切换到了
2
,但学校的防病毒软件不允许我构建应用程序。@Crysis关于
index+2
的评论大体上是关于标准库使用半开放范围的
substr()
实际上不包含两个索引,因此它不适用于
substr()
substr(index,2)
是唯一正确的方法。我可能会为
substr
和索引编写自己的函数。@Crysis好的,在这种情况下,使用长度而不是结束位置实际上更方便。如果你真的遇到了一个末端位置更方便的情况,那么我会说去做。是的。一个符号最多两个字符。
string temp = leftSide.substr(index, (index+1));
string temp = leftSide.substr(index, index);
bool NEXT_LOWER_LETTER = islower(leftSide[index+1]);