C++ 如何在不使用变量_name.at()的情况下引用字符串的最后一个字符?
我当前使用的代码如下所示:C++ 如何在不使用变量_name.at()的情况下引用字符串的最后一个字符?,c++,string,if-statement,reference,C++,String,If Statement,Reference,我当前使用的代码如下所示: if ((text.at(text.size() -1 ) != '!' ) && (text.at(text.size() -1 ) != '?') && (text.at(text.size() -1 ) != ':' ) && (text.at(text.size() -1 ) != ',' ) && (text.at(text.size() -1 ) != ';' ) && (te
if ((text.at(text.size() -1 ) != '!' ) && (text.at(text.size() -1 ) != '?') && (text.at(text.size() -1 ) != ':' ) && (text.at(text.size() -1 ) != ',' ) && (text.at(text.size() -1 ) != ';' ) && (text.at(text.size() -1 ) != '=' ) )
它的细节并不十分重要,但我基本上是在尝试制作一种只使用命令提示符的文字处理器,每当用户在输入缓冲区中没有任何内容的情况下按enter键时,程序就会关闭,因为它以“一种不寻常的方式”终止这意味着这行代码试图引用字符串中不存在的位置,即-1。因此,我需要一种新的方法来引用给定字符串变量中的最后一个字符,该变量仍然可以使用给定的代码行。谢谢你的帮助 在访问其元素并使用或简化代码之前,应检查
文本是否为非空
你这样称呼它:
if (!text.empty())
{
char c = *text.rbegin();
if (c != '!' &&
c != '?' &&
c != ':' &&
c != ',' &&
c != ';' &&
c != '=' )
{
}
}
为了增强代码的可读性,在这种情况下,可以引入局部变量,复制一个char很便宜,如果语句过多,可以缩短。在访问其元素和使用或简化代码之前,应该检查文本是否为空
你这样称呼它:
if (!text.empty())
{
char c = *text.rbegin();
if (c != '!' &&
c != '?' &&
c != ':' &&
c != ',' &&
c != ';' &&
c != '=' )
{
}
}
为了增强代码的可读性,在这种情况下可以引入一个局部变量,复制一个char很便宜,如果语句过多,可以缩短。似乎很容易,只需先检查text.size()>0
if (text.size() > 0 &&
text.at(text.size() - 1) != '!' &&
text.at(text.size() - 1) != '?' &&
text.at(text.size() - 1) != ':' &&
text.at(text.size() - 1) != ',' &&
text.at(text.size() - 1) != ';' &&
text.at(text.size() - 1) != '=')
或者也许你是有意这样做的(你的问题并不清楚)
您还应该简化该表达式,因为它太复杂了。似乎很简单,只需先检查text.size()>0
if (text.size() > 0 &&
text.at(text.size() - 1) != '!' &&
text.at(text.size() - 1) != '?' &&
text.at(text.size() - 1) != ':' &&
text.at(text.size() - 1) != ',' &&
text.at(text.size() - 1) != ';' &&
text.at(text.size() - 1) != '=')
或者也许你是有意这样做的(你的问题并不清楚)
你也应该简化这个表达式,它太复杂了。检查!text.empty()!text.empty()。在使用此函数之前,是否有一个库需要声明,而不是?您调用它:*text.rbegin()!='!'代码>,对吗?我明白了,它不需要其他的libOhh。我是新来的,我试着写一些类似于(text.at(rbegin())!='!')
。为帮助干杯@BenjaminLindley我遗漏了什么吗?之前,他在一个空字符串上使用at
,并得到一个异常。您只是将其修改为取消对无效迭代器的引用,从而导致未定义的行为。他可能认为问题已经解决了,因为程序没有崩溃,因为他得到的不是异常,而是未定义的行为。非常感谢,但当我尝试编译此代码时,我得到错误“'rbegin'未在此范围内声明”。在使用此函数之前,是否有一个库需要声明,而不是?您调用它:*text.rbegin()!='!'代码>,对吗?我明白了,它不需要其他的libOhh。我是新来的,我试着写一些类似于(text.at(rbegin())!='!')
。为帮助干杯@BenjaminLindley我遗漏了什么吗?之前,他在一个空字符串上使用at
,并得到一个异常。您只是将其修改为取消对无效迭代器的引用,从而导致未定义的行为。他可能认为问题已经解决了,因为程序没有崩溃,因为他得到的不是异常,而是未定义的行为。非常感谢,这也应该可以。我觉得这很粗糙,但我正在读一本关于如何编写代码的书,对他们给出的示例感到厌倦,所以我想尝试一些不同的东西。我相信它会随着时间的推移变得更好。感谢您的输入:)实际上,这对于翻译新段落来说真的很方便,所以您已经回答了一个我可能还没来得及回答的问题:谢谢,这也应该可以。我觉得这很粗糙,但我正在读一本关于如何编写代码的书,对他们给出的示例感到厌倦,所以我想尝试一些不同的东西。我相信它会随着时间的推移变得更好。感谢您的输入:)实际上,这对于翻译新段落来说真的很方便,所以您已经回答了一个我可能还没来得及回答的问题:D