C++ - 在 getline 中使用变量作为变量名称

C++ - Using a variable as the variable name in getline

本文关键字:变量 变量名 getline C++      更新时间:2023-10-16

我正在循环浏览一系列问答,以躲避重复的代码并更轻松地管理所提出的问题。

在你看到一个例子之前,我不能说更多:

string nameOfUser, nameOfCourse; // define
string varNames [] = { nameOfUser, nameOfCourse };
string varDesc [] = { "Please enter your name:", "Please enter the course name:" };
for (int i = 0; i < 2; i++)
{
  cout << varDesc[i] << endl;
  getline( cin, varNames[i] );
  cout << endl;
}

上面的代码最终不会从用户的输入中产生任何内容。

我相信问题在于尝试在getline中循环数组varNames。看起来好像它认为varNames[i]本身就是一个变量名 - 我很早就假设它会在循环时打印相应的值,但显然事实并非如此。

简单地说,是否可以简单地使用变量的值作为变量的名称,或者这在getline方面是不可能的?

我在这里并没有完全想到"变量变量名称"(我知道这在C++是不可能的),但是在我看来,它应该能够在循环时使用varNames数组中的值。

在C++中,变量名称只存在于源代码中;一旦程序运行,它们就会消失。因此,不可能使用变量的存储名称来访问C++中的实际变量。

但是,您可以将指针放入如下所示的数组中以获得类似的行为:

string nameOfUser, nameOfCourse;
string * p[2] = {&nameOfUser, &nameOfCourse};
for (int i=0; i<2; i++) {
    cout << varDesc[i] << endl;
    getline(cin, *(p[i]));
    cout << endl;
}

在这里,p通过内存地址而不是名称来引用变量。

这是C++地图数据结构的理想用例,如下所示:

std::map<std::string,std::string> myMap;

第一个字符串将是"变量名称",第二个字符串是用户输入的值。

有关执行此操作的方法,请参阅以下程序:

#include <iostream>
#include <map>
#include <string>
int main (void)
{
    std::map<std::string,std::string> vars;
    std::string entry, varNames[] = {"name of user", "name of course" };
    for (int i = 0; i < sizeof(varNames) / sizeof(varNames[0]); i++) {
        std::cout << "Enter " << varNames[i] << ": ";
        std::getline( std::cin, entry );
        vars[varNames[i]] = entry;
    }
    std::cout << "Name  : " << vars[varNames[0]] << 'n';
    std::cout << "Course: " << vars[varNames[1]] << 'n';
    return 0;
}