Цикл для получения пользовательского ввода с использованием массива cstring С++

У меня есть задание, которое требует, чтобы я написал программу, которая предлагает пользователю ввести имя ученика и его оценку и продолжает повторяться, пока он не введет «выход».

Но я не могу понять, как получить пользовательский ввод для массива, чтобы получить всю строку (которая является именем и фамилией, поэтому я не могу просто сделать cin >> name1 [i], так как есть пробел), но когда Я использую cin.getline или просто getline и компилирую его, я получаю сообщение об ошибке, в котором говорится, что нет функции-члена, соответствующей getline.

Кроме того, когда я компилирую его без getline, это просто непрерывный цикл, который не позволяет мне вводить какую-либо информацию для имени или класса. Я новичок в массивах и cstring, поэтому, пожалуйста, попробуйте понять, где я ошибаюсь. Спасибо.

#include <iostream>
#include <string>
#include <cstring>
#include <cctype>

using namespace std;

int main() {

    const int CAPACITY = 50;
    string name1[CAPACITY];
    string grade[CAPACITY];
    char quit[]= "quit";
    int i;

    //for loop to get names and grades from user until quit is entered
    for (i = 0; i < CAPACITY; i++) {
        while (name1[i] != quit)
            cout << "Please input a name (or 'quit' to quit): ";
            getline(cin, name1[i]);

    //break if name1[i] = quit 
    if (name1[i].compare(quit) == 0) {
        break;
    }

    //continue loop if quit not entered and get the grade from that person
    cout << "Please input this person's grade: ";
    cin >> grade[i];
    }

    return 0;

}

person Holly Thorsted    schedule 11.04.2018    source источник
comment
stackoverflow.com/questions/18786575/using-getline-in-c   -  person Manvir    schedule 11.04.2018
comment
name1 — это не массив строк, это массив char, который представляет собой всего одну строку.   -  person Barmar    schedule 11.04.2018
comment
Вы не можете использовать == для сравнения строк C, вы должны использовать strcmp().   -  person Barmar    schedule 11.04.2018
comment
Похоже, вам нужно изучить основы того, как работают строки C. Если вам нужен массив из 50 строк, он должен быть char name1[50][MAXNAMESIZE];   -  person Barmar    schedule 11.04.2018
comment
@ Бармар, да, это была моя ошибка, я только что исправил ее. Я только что перечитал указания, и там говорится, что нужно установить максимум с помощью CAPACITY, но мне не сказано, чему должна быть равна эта емкость. Сейчас я работаю над функцией strcmp.   -  person Holly Thorsted    schedule 11.04.2018
comment
Не редактируйте вопрос с этими вопросами, это сделает ответы недействительными.   -  person Barmar    schedule 11.04.2018
comment
Почему вы изменили char name1 на string name? Разве вы не должны использовать строки C, а не std::string?   -  person Barmar    schedule 12.04.2018


Ответы (2)


Объявите переменную name1 как std::string, затем просто используйте std::cin:

std::string name1;
std::cin >> name1;

Но если вам действительно нужно получить всю строку, вы всегда можете сделать:

std::string line;
std::getline(std::cin, line);

А потом использовать линейку.

Если ваше задание действительно требует использования cstrings, вы можете:

char line[50];
std::cin.get(line, 50);
person Rama    schedule 11.04.2018
comment
Похоже, его задание требует, чтобы он использовал строки C, а не std::string. - person Barmar; 11.04.2018
comment
Это массив из 50 имен, а не одна строка. - person Barmar; 11.04.2018
comment
@Barmar, да, но поскольку это задание, я даю только необходимые инструменты для решения проблемы. Остальное состоит из конкретных упражнений, которые он должен сделать. - person Rama; 11.04.2018

Несколько вопросов:

  • Для массива строк C вам нужно char name1[50][MAXNAMESIZE];. Вы только что объявили одну строку.
  • При чтении в строку C cin.getline() требуется параметр length, чтобы указать максимальное количество символов для ввода, чтобы не было переполнения буфера.
  • Вам не нужны отдельные циклы для имен и оценок. Получите оценку для каждого ученика сразу после получения его имени.
  • Чтобы сравнить строки C, вы должны использовать strcmp(), а не ==.
  • Когда вы смешиваете >> и getline(), вам нужно вызвать cin.ignore() после >>, чтобы пропустить новую строку. См. cin и getline, пропуская ввод

Код:

#include <iostream>
#include <string>
#include <cstring>
#include <cctype>

using namespace std;

#define MAXNAMESIZE 100

int main() {

    char name1[50][MAXNAMESIZE];
    int grade[50];

    for (int i = 0; i < 50; i++) {

        cout << "Please input a name (or 'quit' to quit): ";
        cin.getline(name1[i], sizeof name1[i]);

        if (strcmp(name1[i], "quit") == 0) {
            break;
        }
        cout << "Please input this person's grade: ";
        cin >> grade[i];
        cin.ignore(numeric_limits<streamsize>::max(), '\n');
    }
    return 0;
}
person Barmar    schedule 11.04.2018
comment
Я использовал то, что вы сказали, но все еще получаю сообщение об ошибке: «Нет подходящей функции-члена для вызова getline», и когда я компилирую ее бесконечный цикл, говорящий мне, пожалуйста, введите имя и ничего не говорит об оценке - person Holly Thorsted; 12.04.2018
comment
Я по ошибке скопировал вашу отредактированную версию вопроса, в котором char было изменено на string. Теперь это исправлено. - person Barmar; 12.04.2018
comment
Однако в первый раз вы были правы, мой профессор хочет, чтобы мы создали массив строковых объектов для представления имени. Но все же, почему он компилирует свой только безостановочный цикл, говорящий мне ввести имя, но никогда не предоставляющий мне возможность ввести его? - person Holly Thorsted; 12.04.2018
comment
Извините, только что понял, что я делаю неправильно, я все еще оставил цикл while - person Holly Thorsted; 12.04.2018