免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: fengshaobin
打印 上一主题 下一主题

[C++] 在c++里面怎样强制用户输入的是整数啊 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2006-09-22 17:34 |只看该作者
原帖由 wuqing 于 2006-9-22 15:28 发表
没有现成的
这个需要根据自己的需要些
就如同JSF中的Web组件一样,原来的输入框是没有范围、类型校验的,因此用户的理解不同可能输入不符合要求的类型从而导致不健壮的程序出现异常,现在很多JSF或者 Web开发ID ...

先多谢了.在编写中>>>

论坛徽章:
0
12 [报告]
发表于 2006-09-22 17:48 |只看该作者
分析一下字符串,除了'0'--'9'都拒绝不就对了

论坛徽章:
0
13 [报告]
发表于 2006-09-23 21:49 |只看该作者
《C++ Primer Plus第五版》说到:
代码:
int n;
cin >> n;

如果用户输入的是一个单词,而不是数字,会有4种情况发生:
1. n值保持不变
2. 不匹配的输入将被保留在输入队列中
3. cin对象的一个错误标记被设置
4. 对cin方法的调用将返回false(如果被转换成bool类型)
应该采取以下措施:
1. 重置cin以接受新的输入
2. 删除错误提示
3. 重新输入

详细的例子:

  1. // Example.cpp -- Get integer number from cin.
  2. // 2006-09-23 21:36

  3. #include <iostream>
  4. using namespace std;

  5. const int MAX = 5;

  6. int main() {
  7.         int golf[MAX];
  8.         for(int i = 0; i < MAX; i++) {
  9.                 cout << "round #" << i + 1 << ": ";

  10.                 while(!(cin >> golf[i])) {
  11.                         cin.clear();                     // reset input

  12.                         while(cin.get() != '\n')
  13.                                 continue;                    // get fid of bad input
  14.                         cout << "Please enter a number: ";
  15.                 }
  16.         }
  17.        
  18.         cout << "Here are your scores:\n";
  19.         for(int i = 0; i < MAX; i++)
  20.                 cout << golf[i] << endl;

  21.         return 0;
  22. }
复制代码


程序说明:最外层的while循环是关键部分,如果输入非法,则cin表达式为false,不会将任何值放到数组中,如果cin表达式为false,则
!(cin >> golf)为true,进入while循环内部:首先调用clear()方法重置输入,如果省略这句,则程序将拒绝继续读取输入;接下来在内部
while循环中使用cin.get()来读取行尾之前的所有输入,删除整行,也可以只删除到下一个空白字符。

论坛徽章:
0
14 [报告]
发表于 2006-09-24 05:58 |只看该作者
每次只读取一个字符,遇到[0-9]的就在屏幕上显示,其余的不显示,这样用户就“明白”,他们只能输入数字。

论坛徽章:
0
15 [报告]
发表于 2006-09-24 12:13 |只看该作者
那你只能取消输入流的行缓冲,自己进行判断。真不好办……
我知道的可以用 ncurses 的 getch() 或 win 下 <conio.h> 有一个 getch()

论坛徽章:
0
16 [报告]
发表于 2006-09-24 23:36 |只看该作者
原帖由 BenBear 于 2006-9-24 12:13 发表
那你只能取消输入流的行缓冲,自己进行判断。真不好办……
我知道的可以用 ncurses 的 getch() 或 win 下 <conio.h> 有一个 getch()

正解. 我参加过的一个产品就是需要先得到用户输入的输入, 然后再打出来.
如果用户输的不是数字, 不要打到屏幕上就可以了.

Unix似乎不需要用ncurses, 直接用settty(记不清名字了)函数.

论坛徽章:
0
17 [报告]
发表于 2006-09-24 23:59 |只看该作者
似乎是curses。我在OpenBSD/3.0下用libcurses[_pic].a
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP