如何保持字符串的值?

时间:2016-10-07 23:23:46

标签: c++ vector

嘿伙计们,我对变量和If语句有疑问。

我问的原因是我在变量的字符串向量中分配标记但是如果我的向量只有3个元素并且我尝试将变量分配给myVector(5)我会收到错误。

这是我解决这个问题的方法

std::string element5;
if(myVector.size () >= 4)
(
    std::string element5 = myVector.at(4)
}

但那不会改变if语句之外的字符串吗?如果我有5个元素并且没有错误检查我的代码工作正常但是如果我传入标准输入我真的不知道有多少元素我将会知道最多有50个元素。

我不需要输出任何元素只需在每个元素上运行此代码

if(countSubstring(element5,"a") > 0)
{
    a = a + 1
}

然后我会输出一个。

如何让element5保留其新字符串?

2 个答案:

答案 0 :(得分:8)

问题

此处的代码重新定义了变量element5

std::string element5;
if(myVector.size () >= 4)
(
    std::string element5 = myVector.at(4)
}

首先在第一行之后声明element5,然后在if语句的第三行重新声明它。这基本上是#34;重新创造"该范围element5的变量{}。然后当然是pop在范围之后。因此,如果您尝试将其打印到范围之外,则无法在element5中看到更改。

解决方案

很简单,只是不要重新声明你的变量,而且你已经完成了所有设置!像这样:

std::string element5;
if(myVector.size () >= 4)
(
    element5 = myVector.at(4)
}

为什么会这样?

就像我说的那样,在汇编级别下变量获得push ed,然后突然变为另一个级别并且相同的变量被重新声明,全局变量被遗忘。一旦范围结束:

{
  //This is a scope
}

重新声明的变量从堆栈中获取pop,我们原来的element5回来了!这将使element5保持在同一位置,因为您实际上并未对其进行更改;)。

未定义的行为(UB)

不要引用超出范围的对象;不要这样做!

C++: Reference to "out of scope" object

参考

What happens when C++ reference leaves it's scope?

What happens in C++ when I pass an object by reference and it goes out of scope?

词汇表

范围:"容器"一个程序目前正在执行;例如,让我们来看看:

int main() {
  //1st scope
  if (true) {
    //2nd scope
    {
      //third scope
    }
  }
}

未定义的行为(UB): 在编译期间随时处于未定义 / 未知状态时。编译器做它决定做的任何事情,使它成为一个非常危险的行为,特别是如果你正在编写一个大项目!这是一个很好的问题/答案:

https://softwareengineering.stackexchange.com/questions/99692/philosophy-behind-undefined-behavior

答案 1 :(得分:1)

你正在重新定义if语句中的字符串,你不应该这样做,因为你想使用之前声明过的字符串。

所以只需将std::string element5 = myVector.at(4)替换为element5 = myVector.at(4)