【问题标题】:C++ structure string and integer inputC++ 结构字符串和整数输入
【发布时间】:2017-06-25 14:57:11
【问题描述】:

我写了下面这个简单的C++结构体实现来看看结构体指针的用法。

#include <iostream>

struct Employee
{
    std::string name;
    std::string sex;
    int e_id;
}emp[2];

void printEmployee(struct Employee *e)
{
    std::cout << e->name << std::endl;
    std::cout << e->sex << std::endl;
    std::cout << e->e_id << std::endl;
}

int main(int argc, char const *argv[])
{
    struct Employee *e_ptr;
    e_ptr = emp;

    for (int i = 0; i < 2; ++i)
    {
        std::getline(std::cin, emp[i].name);
        std::getline(std::cin, emp[i].sex);
        std::cin >> emp[i].e_id;
    }

    for (int i = 0; i < 2; ++i)
    {
        printEmployee(e_ptr+i);
        std::cout << std::endl;
    }
    return 0;
}

输入是

John Smith
male
123
Sarah Collin
female

在这些输入之后,程序会显示输出,尽管代码应该再接受一个输入。输出是

John Smith
male
123



Sarah Collin
0

但是,如果我不包括 int e_id 作为成员,那么代码就可以完美运行。

【问题讨论】:

    标签: c++11 struct


    【解决方案1】:

    这是来自混合 getline 和 cin。 Getline 读取输入,直到遇到(通常)换行符'\n'。它将所有内容都带到换行符,并丢弃换行符。

    cin 会一直读取,直到您遇到空白(例如换行符),但不会将其从流中丢弃。因此,您输入 123 ENTER,这意味着您在流中有 123\n。 Cin 取了 123 但留下了 \n。

    现在您返回到员工姓名的 getline,它会立即在流中看到 \n,这意味着它已经完成,它会将其丢弃。出于好奇,如果您输入 123 SPACE 而不是 enter,它会起作用吗?

    所以实际发生的情况是 John Smith 很好,男性很好,123 很好,但是第二个员工的名字被跳过了,你输入 Sarah Collin 来表示技术上的性别,然后输入 female 来表示应该是e_id。由于女性不是整数,会发生什么?默认情况下,Cin 进入错误状态并跳过进一步的 cin 操作(您也可以将其配置为抛出异常)。所以实际上,您实际上从未为第二个 e_id 输入任何内容,而您看到的 0 是它创建时的样子(您从未对其进行初始化,因此它实际上可以是任何值!读取未初始化的值是未定义的行为。您的编译器可能会通过将 int 设置为 0 来帮助您,但这不是您可以指望的善意)。

    这是其他人遇到您的问题,以及如何使用的示例

    cin.ignore();
    

    解决这个问题。您需要手动忽略该换行符。

    When and why do I need to use cin.ignore() in C++?

    【讨论】:

    • 知道了,谢谢 :) 是的,如果我输入 123SPACE 而不是 enter,它确实有效。
    【解决方案2】:

    读取整数std::cin 时,遇到[+][-][0-9] 以外的字符时停止。也就是说,std::cin 停在不能包含在整数的有效表示中的字符处。

    在输入的第三行有4个字符是123\n

    在读取std::string 时,std::getline 在遇到\n 或分隔符时停止读取字符。此外,std::getline 不会在读取的字符串中存储\n 或分隔字符。

    因此,std::cin 按预期读取整数 emp[0].e_id 并在 \n 处停止。在此之后std::getline 读取\n 并停止并在emp[1].name 中不存储任何内容

    【讨论】:

      猜你喜欢
      • 2020-09-21
      • 1970-01-01
      • 2016-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-24
      • 1970-01-01
      相关资源
      最近更新 更多