2013-02-12 3 views
1

Просто короткий вопрос, и я буду в пути. Почему я получаю ошибки, когда пытаюсь читать строку, используя класс string? Ошибка, которую я получаю: «no operator» >> «соответствует этим операндам/типам операндов: std :: istream >> std :: string *»Не удается прочитать строку из строкового класса

Я начинаю использовать класс вместо cStrings. К сожалению, я продолжаю получать ошибки, когда пытаюсь читать строку, используя cin. Например:

void ProcessEditMenuItems(int menu_choice, std::string fname[], std::string lname[], 
        std::string phone[], std::string bday[]  /*char fname[][NAME_LENGTH], char lname[][NAME_LENGTH], char phone[][NAME_LENGTH], 
         char bday[][NAME_LENGTH]*/) 
{ 
switch (menu_choice) 
{ 
    case 1: 
     std::cout << "\nEnter new first name: "; 
     std::cin >> fname; 
    break; 
    case 2: 
     std::cout << "\nEnter new last name: "; 
     std::cin >> lname; 
    break; 
    case 3: 
     std::cout << "\nEnter new phone number: "; 
     std::cin >> phone; 
    break; 
    case 4: 
     std::cout << "\nEnter new birthday: "; 
     std::cin >> bday; 
    break; 
} 
} 

Приведенный выше код работает для нормальных cStrings, но когда я изменить объявление функции и определение класса строки она не работает.

+0

Я думаю, вам нужно больше узнать. string - _something like_ a char array. поэтому 'string fname' будет _something_ как' char fname [19] '. поэтому нет необходимости использовать '[]' для использования строки в вашем случае. используйте 'string fname []', когда вам нужен массив строк !!! :) – Deamonpog

+0

Мне нужен массив строк. Следовательно, почему я использовал строку fname []. Если вы посмотрите на код с комментариями, вы увидите, что я пытаюсь заменить char fname [] [NAME_LENGTH] - двухмерный массив. – MrPickle5

+1

oh, тогда 'cin >> fname [i]' будет помещать вход в i-ое место массива fname. Вы не можете сделать 'cin >> fname', потому что fname не является строкой, а массивом строк. (operator '>>' из 'std :: cin' не знает, что делать, когда правая сторона оператора' >> 'представляет собой массив строк !!, поэтому он должен давать ошибку компиляции.) Еще вы необходимо работать над тем, как вы передаете параметры. Я предлагаю передать их в качестве указателей или ссылок. – Deamonpog

ответ

1

fname - массив из std::string. Является ли использование массивов похмелье от вашего более раннего использования строк C - char fname[]? Если да, то вы могли бы изменить к прохождению std::string& вместо

void ProcessEditMenuItems(int menu_choice, 
          std::string& fname, 
          std::string& lname, 
          std::string& phone, 
          std::string& bday) 
+0

Если вы посмотрите на код с комментариями, исходный cString был двухмерным массивом (т. Е. Char fname [MAX_FRIENDS] [NAME_LENGTH]). До сих пор работает std :: string & fname? – MrPickle5

+1

А, нет, это не сработает. Если вы хотите иметь массив строк, вы бы определили, какой индекс использовать затем поток в 'fname [index]'. Или вы можете передать 'std :: vector &' и 'push_back' новую строку, если вы хотите добавить в конец массива переменных. (Я изменю свой ответ, если вы подтвердите, подходит ли любой из ваших потребностей.) – simonc

3

Ваши аргументы fname, lname, phone и bday объявлены как std::string arg[], который для аргумента преобразуется в std::string* arg. То есть, они являются указателями на std::string. У вас будет только аргумент, объявленный std::string arg[], если вы хотите передать массив из std::string.

Если вы передаете один std::string для каждого аргумента, то то, что вы на самом деле хотите, является ссылочным типом. Например, fname должен быть std::string& fname. Ссылка позволяет передать std::string в функцию без копирования, так что, когда вы читаете ее с помощью >>, вы изменяете исходный объект.

2

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

Измените прототип функции для:

void ProcessEditMenuItems(
    int menu_choice, 
    std::string& fname, 
    std::string& lname, 
    std::string& phone, 
    std::string& bday 
) 

И это должно быть хорошо.

При преобразовании из C-строк в std::strings, вы можете использовать следующую таблицу преобразования:

Old parameter | New parameter  | Description 
const char* | const std::string& | Non-modifiable parameter 
char*   | std::string&  | Modifiable string 

Самое приятное в том, что вам не нужно заботиться о размере строки при изменении его в то время как вы бы имеют отношение к char*. Также вам не нужно обрабатывать удаление/перераспределение, если требуется увеличение размера.

0

Эта ошибка похожа на int arr[2]; arr = 1;
fname - это массив, содержащий строковые объекты. «std :: cin >>» означают строки из стандартного ввода. Мы можем назначить только строковый объект для fname [0], fname [1] ....
попробуйте std::cin >> fname[0];

Смежные вопросы