C++ 如何避免一次输入一个字而不是一行字?

C++ 如何避免一次输入一个字而不是一行字?,c++,C++,我正在读“C++初级读物plus/Stephen Prata” 这是本书的代码 while (!(cin >> golf[i])) { cin.clear(); // reset input while (cin.get() != '\n') continue; // get rid of bad input cout << "Please enter a number: ";

我正在读“C++初级读物plus/Stephen Prata”

这是本书的代码

    while (!(cin >> golf[i])) {
        cin.clear();    // reset input
        while (cin.get() != '\n')
            continue;   // get rid of bad input
        cout << "Please enter a number: ";
    }
while(!(cin>>高尔夫[i])){
cin.clear();//重置输入
而(cin.get()!='\n')
continue;//清除错误输入

无法要在达到某个数字之前扔掉单词,请执行以下操作:

string word;

cout << "Please enter a number: ";

while(!(cin >> golf[i])){
    cin.clear();
    cin >> word;

    if(cin.rdbuf()->in_avail() == 1){
        cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
        cout << "Please enter a number: ";
    }
}

要在达到某个数字之前扔掉单词,请执行以下操作:

string word;

cout << "Please enter a number: ";

while(!(cin >> golf[i])){
    cin.clear();
    cin >> word;

    if(cin.rdbuf()->in_avail() == 1){
        cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
        cout << "Please enter a number: ";
    }
}

要在达到某个数字之前扔掉单词,请执行以下操作:

string word;

cout << "Please enter a number: ";

while(!(cin >> golf[i])){
    cin.clear();
    cin >> word;

    if(cin.rdbuf()->in_avail() == 1){
        cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
        cout << "Please enter a number: ";
    }
}

要在达到某个数字之前扔掉单词,请执行以下操作:

string word;

cout << "Please enter a number: ";

while(!(cin >> golf[i])){
    cin.clear();
    cin >> word;

    if(cin.rdbuf()->in_avail() == 1){
        cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
        cout << "Please enter a number: ";
    }
}

让我们先看看现有的代码:

    while (cin.get() != '\n')
        continue;
这就是读取新行的内容。我们读取一个字符,将其与新行进行比较,如果不相等,我们读取另一个字符。因此,它读取字符,当到达新行时停止读取

如果我们想改为读取空格字符,只需更改比较的值:

    while (cin.get() != ' ')
        continue;
如果我们想在任何空白处停止读取,我们可以使用一个函数来告诉我们字符是否为空白。该函数如下所示:

bool is_white_space(char ch) { 
    return ch == ' ' || ch == '\t' || ch == '\n' || ch == '\r' || ch == '\v';
}
但这是一项非常常见的任务,标准库已经有了一个
isspace
函数,因此我们不必编写自己的函数。我们只需使用它:

while (!isspace(cin.get())
    continue;

个人,我至少应该考虑把它本身变成一个函数,并赋予它一个可读的名称,比如“代码> SkIPToToWielStays,所以我们的外环看起来像:

void skip_to_space(std::istream &in) { 
    in.clear();
    while (!isspace(in.get()))
        continue;
}

// ...
while (!(cin >> golf[i])) {
    skip_to_space(cin);
    cout << "Please enter a number: ";
}

现在很明显,
cin.get()
总是至少出现一次,并且一直持续到出现空白字符为止。

让我们从查看现有代码开始:

    while (cin.get() != '\n')
        continue;
这就是读取新行的内容。我们读取一个字符,将其与新行进行比较,如果不相等,我们读取另一个字符。因此,它读取字符,当到达新行时停止读取

如果我们想改为读取空格字符,只需更改比较的值:

    while (cin.get() != ' ')
        continue;
如果我们想在任何空白处停止读取,我们可以使用一个函数来告诉我们字符是否为空白。该函数如下所示:

bool is_white_space(char ch) { 
    return ch == ' ' || ch == '\t' || ch == '\n' || ch == '\r' || ch == '\v';
}
但这是一项非常常见的任务,标准库已经有了一个
isspace
函数,因此我们不必编写自己的函数。我们只需使用它:

while (!isspace(cin.get())
    continue;

个人,我至少应该考虑把它本身变成一个函数,并赋予它一个可读的名称,比如“代码> SkIPToToWielStays,所以我们的外环看起来像:

void skip_to_space(std::istream &in) { 
    in.clear();
    while (!isspace(in.get()))
        continue;
}

// ...
while (!(cin >> golf[i])) {
    skip_to_space(cin);
    cout << "Please enter a number: ";
}

现在很明显,
cin.get()
总是至少出现一次,并且一直持续到出现空白字符为止。

让我们从查看现有代码开始:

    while (cin.get() != '\n')
        continue;
这就是读取新行的内容。我们读取一个字符,将其与新行进行比较,如果不相等,我们读取另一个字符。因此,它读取字符,当到达新行时停止读取

如果我们想改为读取空格字符,只需更改比较的值:

    while (cin.get() != ' ')
        continue;
如果我们想在任何空白处停止读取,我们可以使用一个函数来告诉我们字符是否为空白。该函数如下所示:

bool is_white_space(char ch) { 
    return ch == ' ' || ch == '\t' || ch == '\n' || ch == '\r' || ch == '\v';
}
但这是一项非常常见的任务,标准库已经有了一个
isspace
函数,因此我们不必编写自己的函数。我们只需使用它:

while (!isspace(cin.get())
    continue;

个人,我至少应该考虑把它本身变成一个函数,并赋予它一个可读的名称,比如“代码> SkIPToToWielStays,所以我们的外环看起来像:

void skip_to_space(std::istream &in) { 
    in.clear();
    while (!isspace(in.get()))
        continue;
}

// ...
while (!(cin >> golf[i])) {
    skip_to_space(cin);
    cout << "Please enter a number: ";
}

现在很明显,
cin.get()
总是至少出现一次,并且一直持续到出现空白字符为止。

让我们从查看现有代码开始:

    while (cin.get() != '\n')
        continue;
这就是读取新行的内容。我们读取一个字符,将其与新行进行比较,如果不相等,我们读取另一个字符。因此,它读取字符,当到达新行时停止读取

如果我们想改为读取空格字符,只需更改比较的值:

    while (cin.get() != ' ')
        continue;
如果我们想在任何空白处停止读取,我们可以使用一个函数来告诉我们字符是否为空白。该函数如下所示:

bool is_white_space(char ch) { 
    return ch == ' ' || ch == '\t' || ch == '\n' || ch == '\r' || ch == '\v';
}
但这是一项非常常见的任务,标准库已经有了一个
isspace
函数,因此我们不必编写自己的函数。我们只需使用它:

while (!isspace(cin.get())
    continue;

个人,我至少应该考虑把它本身变成一个函数,并赋予它一个可读的名称,比如“代码> SkIPToToWielStays,所以我们的外环看起来像:

void skip_to_space(std::istream &in) { 
    in.clear();
    while (!isspace(in.get()))
        continue;
}

// ...
while (!(cin >> golf[i])) {
    skip_to_space(cin);
    cout << "Please enter a number: ";
}

现在很明显,
cin.get()
至少会发生一次,并且会一直发生,直到我们找到一个空白字符。

您可能需要编辑问题的标题,使其在没有引用上下文的情况下有意义。您可能还想看一看,这样可以避免推荐本书(看看代码示例,我明白了原因!),链接到不利的评论。它建议了其他几本可能更可取的初学者书籍。谢谢。新标题可以吗?您可能希望编辑问题的标题,使其在没有引用上下文的情况下有意义。您可能还想看一看,这样可以避免推荐本书(看看代码示例,我明白了原因!),链接到不利的评论。它建议了其他几本可能更可取的初学者书籍。谢谢。新标题可以吗?您可能希望编辑问题的标题,使其在没有引用上下文的情况下有意义。您可能还想看一看,这样可以避免推荐本书(看看代码示例,我明白了原因!),链接到一个不利的评论。它建议了其他几本可能更可取的初学者书籍。谢谢。新标题可以吗?您可能希望编辑问题的标题,以便在不考虑引用上下文的情况下使其有意义。您可以