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因此,传递第一个索引和字符数。此外,如果不在for循环中使用迭代器,则不必在for循环中使用迭代器。for(size_t index=0;index子字符串< /> >并遵循教程。如果代码,我仍然能够使用索引的字符串吗?是的,你仍然可以使用它(但是你会得到一个我相信的警告)。谢谢。那么,它应该是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]);