SIGINT 处理和 getline

发布于 2024-08-12 11:58:54 字数 657 浏览 8 评论 0原文

我编写了这个简单的程序:

void sig_ha(int signum)
{
cout<<"received SIGINT\n";
}

int main()
{
 string name;
 struct sigaction newact, old;
 newact.sa_handler = sig_ha;
 sigemptyset(&newact.sa_mask);
 newact.sa_flags = 0;
 sigaction(SIGINT,&newact,&old);

 for (int i=0;i<5;i++)
     {
     cout<<"Enter text: ";
     getline(cin,name);
     if (name!="")
         cout<<"Text entered: "<<name;
     cout<<endl;
     }
 return 0;
}

如果在程序等待输入时按下 Ctrl+C,我会得到以下输出:
输入文本:收到 SIGINT

输入文本:
输入文字:
输入文字:
输入文字:(

程序继续循环,不等待输入)

我该怎么办?

I wrote this simple program:

void sig_ha(int signum)
{
cout<<"received SIGINT\n";
}

int main()
{
 string name;
 struct sigaction newact, old;
 newact.sa_handler = sig_ha;
 sigemptyset(&newact.sa_mask);
 newact.sa_flags = 0;
 sigaction(SIGINT,&newact,&old);

 for (int i=0;i<5;i++)
     {
     cout<<"Enter text: ";
     getline(cin,name);
     if (name!="")
         cout<<"Text entered: "<<name;
     cout<<endl;
     }
 return 0;
}

If I hit Ctrl+C while the program waits for input I get the following output:
Enter text: received SIGINT

Enter text:
Enter text:
Enter text:
Enter text:

(the program continues the loop without waiting for input)

What should I do?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

笑叹一世浮沉 2024-08-19 11:58:54

尝试在 cout 语句之前添加以下内容:

cin.clear();  // Clear flags
cin.ignore(); // Ignore next input (= Ctr+C)

Try adding the following immediately before your cout statement:

cin.clear();  // Clear flags
cin.ignore(); // Ignore next input (= Ctr+C)
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文