C ++程序只在Linux上使用<curses.h>接受用户的整数

我需要在Linux上制作一个c ++程序,其中使用的只能input整数,没有字符和特殊字符。 那么对于窗口(我已经使用conio.h头文件为getch() )下面是程序工作正常。

 #include<iostream> #include<stdio.h> #include<conio.h> int getOnlyIntegers() { int ch; long int num = 0; do { ch = getch(); if(ch >= 48 && ch <= 57) { printf("%c",ch); num = (ch-48) + (num*10); } if(ch == 13) { break; } }while(1); return num; } int main() { int x; x = getOnlyIntegers(); printf("\n%d", x); return 0; } 

现在在Linux中,我使用#include<curses.h>头文件来使用getch(); 和代码是

 #include<iostream> #include<ctype.h> #include "curses.h" using namespace std; int getOnlyNumbers() { int ch; int num = 0; initscr(); do { ch = getch(); if(isdigit(ch)) { cout<<ch; num = (ch - 48) + (num*10); } if(ch == '\n') // if the user press enter key { break; } }while(1); return num; } int main() { int num; num = getOnlyNumbers(); cout<<endl<<num; return endwin(); } 

在编译它我得到一个新的屏幕(我想这可能是由于initscr() )和每个数字,字符和特殊字符被打印在屏幕上,如果我按Enter键,然后屏幕保持原样。

我需要做什么正确的?

为什么我用getch()?

因为variable ch将存储通过getch()input的内容,而不显示在屏幕上。 所以这个程序的主要目的是只显示输出和input数字。

这里是一些屏幕的图像:

1> 在这里输入图像描述

2> 在这里输入图像描述

3> 在这里输入图像描述

在第二个图像中,当我按sad这些字符也显示出来,我不希望显示这些字符。

如果你坚持把iostream和curses混合起来,还有一些问题存在,在这个修改的例子中修复:

  • initscr设置一个标志告诉curses清除下一次刷新的屏幕。 getch刷新屏幕。
  • OP的意图是不提供全屏的程序; 使用过滤器进行单行提示
  • 为了防止某些使用curses的输出被忽略,使用newterm使curses的输出转到标准错误(允许重定向程序的输出)
  • endwin返回一个-1错误,这可能不是从main返回退出代码的意图。

这里是修改的例子:

 #include <iostream> #include <ctype.h> #include <curses.h> using namespace std; int getOnlyNumbers() { int ch; int num = 0; filter(); newterm(NULL, stderr, stdin); noecho(); do { ch = getch(); if(isdigit(ch)) { std::cout << static_cast<char>(ch) << std::flush; num = (ch - 48) + (num*10); } if(ch == '\n') // if the user press enter key { break; } } while(1); endwin(); return num; } int main() { int num; num = getOnlyNumbers(); cout<<endl<<num; return 0; } 

您至少需要完成以下三件事才能使您的代码正常工作,并在下面标注以下注释:

 int getOnlyNumbers() { int ch; int num = 0; initscr(); // disable echo by calling noecho() function noecho(); do { ch = getch(); if(isdigit(ch)) { // cast int to char to get correct printout, // and flush to force printing it without a newline. std::cout << static_cast<char>(ch) << std::flush; num = (ch - 48) + (num*10); } if(ch == '\n') // if the user press enter key { break; } } while(1); return num; } 

作为一个侧面说明,我会建议不要using namespace std; 即使在一个.cpp文件,一般来说,尤其是当你包括额外的库,如这里。 名称冲突太容易了,看似无法解释的奇怪行为。 更好地输出std::即使它感觉重复,它可以节省“浪费”的时间很多次,当它可以帮助你避免一个神秘的bug。

链接作为浏览文档的可能起点:

您需要查看isalpha的手册页,其中包括isdigitisdigit_l等的条目。 你所拥有的代码是非常可怕的,而且在任何使用非ASCII字符的环境(例如UTF-8环境)中都没有机会工作。