C ++ String在if语句之外消失

时间:2014-11-06 15:39:45

标签: c++ string if-statement

我是一个关于C ++的新手,我正在与一个(也许是简单的)挣扎。我想编写一个代码来检查字符串行的第一个字,并将字符串行的第二个字复制到字符串x_start,x_end或num_steps,如果字符串的第一个字等于" x_start" ," x_end"或" num_steps"。

我要解决的问题如下。在if语句中,第二个单词(label)的值被复制到字符串x_start,但是当我在调试器中进一步向下移动时,字符串x_start的内容在if语句结束括号后消失。输出的第一句(cout)现在等于:x_start =,其中应该是:x_start = 0.

有谁知道为什么会这样,以及如何解决?提前谢谢!

#include <iostream>
#include <fstream>
#include <cassert>
#include <sstream>
#include <string>

int main(int argc, char** argv) {
    std::string x_end;
    std::string num_steps;
    std::string x_start;

    std::string line = "x_start 0";

    std::istringstream linestream(line);

    while (!linestream.eof()) {
        std::string label;
        std::string value;
        linestream >> label >> value;

        if(label.compare("x_start") == 0){
            std::string x_start = value;
        }
        else if(label.compare("x_end") == 0){
            std::string x_end = value;
        }
        else if(label.compare("num_steps") == 0){
            std::string num_steps = value;
        }
        else{
            std::cout<<"The format of the text in the file 'params.in' ";
            std::cout<<"is not correct"<<std::endl";
            break;
        }

        std::cout<<"x_start = "<<x_start<<std::endl;
        std::cout<<"x_end = "<<x_end<<std::endl;
        std::cout<<"num_steps = "<<num_steps<<std::endl;

    }
    return 0;
}

3 个答案:

答案 0 :(得分:3)

而不是这个

        std::string x_start = value;

写这个

        x_start = value;

您的代码引入了新变量x_start,它使用相同的名称“隐藏”现有变量。设置这个新变量,然后立即销毁。所以,只是不要引入新变量,一切都会好的。

x_endnum_steps重复此操作。

答案 1 :(得分:0)

if(label.compare("x_start") == 0){
        std::string x_start = value;
 }

应该是

if(label.compare("x_start") == 0){
        x_start = value;
 }

答案 2 :(得分:0)

当你这样做时

if(label.compare("x_start") == 0){
    std::string x_start = value;
} //^^^^^^^^^^^

你告诉编译器如下:“我需要一个名为x_start的新字符串变量。这个变量将从外部替换x_start直到if语句结束”。

但这不是你想要的:你想要分配现有的变量!删除声明将解决此问题:

if(label.compare("x_start") == 0){
    x_start = value;
}

现在您要分配一个现有变量 - 在if语句之后保留的变量。当然,您需要对其语句之外的 shadow 变量的其他声明执行相同的操作。

注意:变量在程序的哪个部分可见的技术术语是范围。查看它是什么意思以及如何使用它。