我是一个关于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;
}
答案 0 :(得分:3)
而不是这个
std::string x_start = value;
写这个
x_start = value;
您的代码引入了新变量x_start
,它使用相同的名称“隐藏”现有变量。设置这个新变量,然后立即销毁。所以,只是不要引入新变量,一切都会好的。
对x_end
和num_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 变量的其他声明执行相同的操作。
注意:变量在程序的哪个部分可见的技术术语是范围。查看它是什么意思以及如何使用它。