我需要在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>
在第二个图像中,当我按s
, a
和d
这些字符也显示出来,我不希望显示这些字符。
如果你坚持把iostream和curses混合起来,还有一些问题存在,在这个修改的例子中修复:
这里是修改的例子:
#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
的手册页,其中包括isdigit
, isdigit_l
等的条目。 你所拥有的代码是非常可怕的,而且在任何使用非ASCII字符的环境(例如UTF-8环境)中都没有机会工作。