【问题标题】:How to keep the value of a string?如何保持字符串的值?
【发布时间】:2016-10-07 23:23:46
【问题描述】:

大家好,我有一个关于变量和 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 保留它的新字符串?

【问题讨论】:

  • 你能给我们你需要运行的实际代码吗?

标签: c++ vector


【解决方案1】:

问题

您的代码在这里重新定义了您的变量element5

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

这里首先在第一行之后声明element5,然后在if 语句的第三行重新声明它。这实质上为该范围{}“重新创建”了变量element5。然后当然是poped 在范围之后。因此,如果您尝试将其打印到范围之外,您将不会看到 element5 的变化。

解决方案

很简单,只需不要重新声明变量,一切就绪!像这样:

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

为什么会这样?

就像我说的,在汇编级别,变量得到pushed,然后突然当它下降到另一个级别并且重新声明相同的变量时,全局变量被遗忘了。一旦范围结束:

{
  //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): 在编译期间给定的任何时间处于undefined/unknown状态时。编译器做它决定做的任何事情,使它成为一种非常危险的行为,特别是如果你正在编写一个大项目!这是这个主题的一个很好的问题/答案:

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

【讨论】:

  • @ddog 欢迎您!任何问题都没有问题可以回答。顺便说一句,这是我的最终版本编辑.. 很抱歉多次编辑:P
  • 很好的答案,但是 UB 的定义是错误的。这意味着 C++ 标准没有记录将要发生的事情。未定义/未知状态几乎肯定会触发 UB 或者是 UB 的结果,但 UB 是发生了什么,而不是什么。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-15
    • 1970-01-01
    • 1970-01-01
    • 2016-11-01
    • 2018-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多