2014-12-12 2 views
1

Я прохожу через ряд Q & A, чтобы уклониться от повторяющегося кода и упростить управление запрошенными вопросами.C++ - Использование переменной в качестве имени переменной в getline

Не намного больше, я могу сказать, пока не увидите пример:

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; 
} 

Приведенный выше код в конечном счете, ничего не производит из пользовательского ввода.

Я считаю, что проблема заключается в попытке зацикливать массив varNames в getline. Кажется, что он думает, что varNames[i] - это имя самой переменной. Я предположил, что на раннем этапе я буду печатать соответствующее значение при зацикливании, но это, очевидно, не так.

Проще говоря, можно ли просто использовать значение переменной как имя переменной, или это невозможность с точки зрения getline?

Я не думаю о «именах переменных переменных» здесь (я понимаю, что это невозможно в C++), но, как я вижу, он должен иметь возможность использовать значения в массиве varNames при циклировании.

+0

Что такое 'nameOfUser'? Вы не показываете его, и ваш код не будет компилироваться без него. –

+0

@John Zwinck. Это определено ранее в программе, я продолжу и включу его в пример, чтобы быть понятным. –

ответ

3

В 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 ссылается на переменные их адреса памяти, а не их названия.

2

Это идеальный случай использования для ++ структуры данных карты 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; 
} 
Смежные вопросы