Передача пользовательского ввода в функцию с параметрами char * - PullRequest
1 голос
/ 03 августа 2011

Я новичок в этом, поэтому я знаю, что это, вероятно, что-то простое.

У меня есть такая функция

void GroceryList::addRecord(char* itemName, char* itemType, char rating){
//do some code;
}

Моя проблема в том, что у меня проблемы с созданием правильных аргументов для передачи функции.

I've tried something like
void main() {
    string itemName;
    cin >> itemName;
    string itemType;
    cin >> itemType;
    string rating;
    cin >> rating;

gradeBook.addRecord(itemName, itemType, rating);
}

Я неожидаю, что это сработает, так как функция ожидает char *, но я не могу понять, как получить пользовательский ввод в переменную, которую я могу передать функции.Я искал буквально 13 часов, пытаясь найти то, что я могу найти, но пока не повезло.

Ответы [ 5 ]

5 голосов
/ 03 августа 2011

Ну, не используйте char*.

void GroceryList::addRecord(const std::string& itemName, const std::string& itemType, const std::string& rating) { /* ... */ }

Вы можете получить const char* (не char*) из string с c_str() функцией-членом, например itemName.c_str()но если вы не взаимодействуете с библиотеками C, вам это не нужно.

0 голосов
/ 03 августа 2011

Простой ответ: вы не можете. Если вы можете изменить GroceryList::addRecord, измените его на std::string const&. если ты не может изменить его, тогда вы должны задать вопрос: почему он использует char*? Есть два возможных ответа: автор не понял const, или слишком ленив, чтобы использовать его, и фактически не изменяет указал на строки. В этом случае что-то вроде const_cast<char*>( itemName.c_str() ) можно использовать; это многословно, но это цена, которую вы платите, когда автор кода не выполняет свою работу правильно. Другой возможный ответ заключается в том, что код изменяет что-то через указатель. В этом случае единственное решение включает в себя сделать копию строки в char[] и передать ее.

0 голосов
/ 03 августа 2011

Использовать std :: string :: c_str (); вот для чего:

gradeBook.addRecord(itemName.c_str(), itemType.c_str(), rating.c_str());

Эта функция возвращает const char *. Тем не менее, функция addRecord не кажется правильной, поэтому вам нужно это исправить.

0 голосов
/ 03 августа 2011

Вы можете использовать строку, а затем при передаче просто вызвать c_str() в строке.Для оценки вы можете просто использовать char.

. Тогда вызов функции выглядит следующим образом:

gl.addRecord(itemName.c_str(), itemType.c_str(), rating);

. Чтобы это работало, вам нужно изменить сигнатуру функции на * 1008.* вместо char*.

0 голосов
/ 03 августа 2011

Измените прототип функции на

void GroceryList::addRecord(string itemName, string itemType, string rating){
//do some code;
}

Я также рекомендую константную корректность в вашем коде, если вы не собираетесь изменять аргументы, передайте их как ref с помощью const (для производительности)

void GroceryList::addRecord(const string& itemName, const string& itemType, const string& rating){
//do some code;
}

Все зависит от фактического тела метода, которое вы не описали.

...