【问题标题】:Why is getline so inconsistent?为什么 getline 如此不一致?
【发布时间】:2012-09-11 07:13:18
【问题描述】:

我在计算机实验室,没有一个导师能弄清楚为什么我的getline 不能正常工作。它没有正确存储信息(仅存储 1 或 2 个字母)。有谁知道为什么会这样?

void addMovie(Inventory movie[], int &count)
{
    string s;
    int i;

    cout << "Please enter the SKU " << endl;
    cin >> i;
    movie[count].sku = i;

    cout << "Please enter the name of the movie you wish to add " << endl;

    cin.ignore('\n');
    getline(cin, s, '\n');
    movie[count].title = s;

    count++;
}

【问题讨论】:

  • 请注意,您可能应该使用某种标准容器而不是 C 样式数组。您似乎没有在这里进行任何边界检查。
  • 您也不必在getline 上输入'\n'。这是默认分隔符。

标签: c++ string getline


【解决方案1】:

std::istream::ignore(即cin.ignore())的第一个参数是要丢弃的字符数。 '\n' 的值的 ASCII 码为 10,因此 '\n' 被隐式转换为整数(很可能是 10,但如果使用不同的编码,它可能会有所不同 - EBCDIC 使用 21),这就是多少字符被忽略,剩下一些。

您真正想要的是丢弃最大可能的数字,直到找到换行符:

#include <limits> //for numeric_limtis
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');

【讨论】:

  • 编译器不应该警告这种隐式转换吗?
  • @muntoo,不,这是标准明确定义的常见转换。 C++ 不会像 Java 那样将 intchar 区分为需要用户保证才能转换的单独类型,因此两者可以互换使用。您可以在诸如tolower 之类的函数上看到这一点,它接受并返回int。不过,正如我所相信的那样,那个来自C。整数和字符之间的整个事情可能来自C,但我不记得了。 SO上的某个地方可能对此进行了一些很好的讨论。
  • @muntoo,举个例子,这是std::string 没有构造函数采用单个字符的一个很好的理由。如果您在 std::string str(10); 中期望一个长度为 10 的字符串,它会隐式转换为 char 并改用它。它也可以反过来工作。我刚刚记得的另一件事是 C 的字符文字的类型为 int,而不是 char。我忘记了当时 C 是否有 char,但即使拥有它,像 tolower 这样的东西也必须首先将字符文字转换为 char
  • @muntoo,为了清除第一个中的某些内容,它们被视为不同的类型,因为 void f(char);void f(int); 是明确的,但只有一个,哪一个都没关系你进来了。
猜你喜欢
  • 2013-05-14
  • 1970-01-01
  • 2018-07-02
  • 2021-11-13
  • 1970-01-01
  • 2016-02-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-21
相关资源
最近更新 更多