【问题标题】:Loop to get user input using cstring array c++循环使用cstring数组c ++获取用户输入
【发布时间】:2018-09-21 20:18:09
【问题描述】:

我有一个作业,要求我编写一个程序,提示用户输入学生的姓名和他们的成绩,并不断循环,直到他们输入“退出”。

但我不知道如何获取数组的用户输入以获取整行(这是名字和姓氏,所以我不能只做 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;

}

【问题讨论】:

  • name1 不是字符串数组,而是char 的数组,也就是一个字符串。
  • 不能使用==比较C字符串,必须使用strcmp()
  • 看来您需要学习 C 字符串如何工作的基础知识。如果你需要一个包含 50 个字符串的数组,它应该是 char name1[50][MAXNAMESIZE];
  • @Barmar 是的,这是我的错误,我刚刚修复了它。我只是重新阅读了说明,它说用 CAPACITY 设置最大值,但它没有告诉我该容量应该等于多少。我现在正在处理 strcmp 函数

标签: c++ arrays loops user-input c-strings


【解决方案1】:

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

【讨论】:

  • 听起来他的作业要求他使用 C 字符串,而不是 std::string
  • 这是一个包含 50 个名称的数组,而不仅仅是一行。
  • @Barmar,是的,但由于这是一项任务分配,我只提供解决问题的必要工具。剩下的就是特定的练习,他必须做什么。
【解决方案2】:

几个问题:

  • 对于 C 字符串数组,您需要 char name1[50][MAXNAMESIZE];。您刚刚声明了一个字符串。
  • 读入 C 字符串时,cin.getline() 需要 length 参数来指定要输入的最大字符数,因此不会溢出缓冲区。
  • 您不需要为名称和等级单独循环。获得每个学生的姓名后,立即获得他们的成绩。
  • 要比较 C 字符串,您必须使用 strcmp(),而不是 ==
  • 当您混合使用&gt;&gt;getline() 时,您需要在&gt;&gt; 之后调用cin.ignore() 以跳过换行符。见cin and getline skipping input

代码:

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

【讨论】:

  • 我使用了你所说的,但我仍然收到一条错误消息“没有匹配的成员函数用于调用 'getline'”,并且当我编译它时,它会出现一个永无止境的循环,告诉我请输入名称而不是说说成绩
  • 我错误地复制了问题的编辑版本,将char 更改为string。现在已经修好了。
  • 你第一次是对的,我的教授希望我们创建一个字符串对象数组来表示名称。但是当它编译它只是一个不间断的循环告诉我输入名称但从来没有给我输入它的选项时,怎么会这样?
  • 抱歉刚刚发现我做错了什么,我仍然留在我的while循环中
猜你喜欢
  • 2016-11-03
  • 2016-07-27
  • 1970-01-01
  • 2013-11-10
  • 2022-08-04
  • 2011-10-19
  • 1970-01-01
  • 2016-09-19
  • 1970-01-01
相关资源
最近更新 更多