程序接受来自标准输入但不接受来自终端的输入

问题描述

这是我的程序

    #include <iostream>
using namespace std;

class Student
{
    string name;
public:
    Student(string input)
    {
        name = input;
    }
    Student()
    {
        name = "UnkNown";
    }
    void get_name()
    {
        char c;
      
    while (getline(cin,name))
    { 
    for (int i = 0; i < name.length(); i++) {

        c = name.at(i);         

        if (! ( ( c >= 'a' && c <= 'z' ) || ( c >= 'A' && c <= 'Z' ) || c==' ' || c=='\n') ) {

             name = "UnkNown";
        }
     }
 }

    }
    void print_name()
    {
        cout << name << endl;
    }
};

int main()
{
        Student name;
        name.get_name();
        name.print_name();
    return 0;
}         

它正在接受来自标准输入的输入并正常工作,但不以任何方式来自终端。 我无法理解程序的这种行为。

终端输入不工作

https://i.stack.imgur.com/IyLRV.jpg

标准输入输入

https://i.stack.imgur.com/Zj6fH.jpg

解决方法

更改这一行:

while (getline(cin,name))

进入

if (getline(cin,name))

可能会按您的预期工作。你还没有打破循环,所以它总是在等待控制台输入。

或者您可以在控制台中发送 EOF,请参阅此 question

完整程序:

#include <iostream>
using namespace std;

class Student {
  string name;

 public:
  Student(string input) { name = input; }
  Student() { name = "Unknown"; }
  void get_name() {
    char c;

    if (getline(cin,name)) {
      for (int i = 0; i < name.length(); i++) {
        c = name.at(i);

        if (!((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || c == ' ' ||
              c == '\n')) {
          name = "Unknown";
        }
      }
    }
  }
  void print_name() { cout << name << endl; }
};

int main() {
  Student name;
  name.get_name();
  name.print_name();
  return 0;
}
,
void get_name()
{
    char c;
    getline(cin,name);

    for (int i = 0; i < name.length(); i++)
    {

        c = name.at(i);

        if (!((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || c == ' ' || c == '\n'))
        {

            name = "Unknown";
        }
    }
    
}

那里不需要while循环。如果你把它放在那里,那么它将永远接受输入。您可以使用循环并尝试打破它,但效率不高。