免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 16887 | 回复: 12
打印 上一主题 下一主题

[C++] 请问C++中如何判断输入的是数字呀? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-03-20 01:33 |只看该作者 |倒序浏览
我写了一段代码如下:

    int number;
    do{
        cout<<"Please input Number:"<<flush;
        cin>>number;
    }while(number<=0);

当我输入的是一个字符时它就陷入了无限循环当中,这是为什么呀?我该怎么改这段代码呢?谢谢

论坛徽章:
0
2 [报告]
发表于 2006-03-20 11:16 |只看该作者
有人知道哪里错了吗?为什么do-while会陷入死循环,而里面的cin好像一点作用都起不了

论坛徽章:
0
3 [报告]
发表于 2006-03-20 11:42 |只看该作者
int number;
    do{
        cout<<"Please input Number:"<<flush;
        cin>>number;
    }while(number<=0);


int number;

cout<<"please input number:"<,std::flush;

while( !(cin>>number)||(age>0) )
{
     cout<<"please input number:"<,std::flush;
      std::cin.clear();
      std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n' );
}

原因:becuase the numerical extractor leaves non-digital behind in the input buffer. and you should always put cin>>>x after while whenever there is a loop.

论坛徽章:
0
4 [报告]
发表于 2006-05-25 13:52 |只看该作者

[菜鸟问]C++如何判断输入的仅是数字1 ,2,或3,如下程序..

#include <iostream>
using namespace std;
void main()
{
  int choice;
  cout << " 1:刷新"<<endl;
  cout << " 2:查找"<<endl;
  cout << " 3:删除"<<endl;
  do
  {
      cout <<"请选择:1,2,或3"<<endl;
      cin >>choice;
    }while (!(choice == 1 || choice == 2 || choice == 3));
  
  
  switch (choice)
  {
  case 1:
     cout<< "你输入的是1"<<endl;
     break;
  case 2:
     cout<< "你输入的是2"<<endl;
     break;
  case 3:
     cout<< "你输入的是3"<<endl;
     break;
   }
     
}

当我输入的是字母时,while语句就陷入死循环,不知如何解决?
请指教!!!!谢谢!!!
Sample TextSample Text

论坛徽章:
0
5 [报告]
发表于 2006-05-25 13:57 |只看该作者
我觉得和上面的错误很相似,也照着上面的提示改过好像还是不行
所以再来这里问问!!!!!!!!!!!!

论坛徽章:
0
6 [报告]
发表于 2006-05-25 14:42 |只看该作者
do
  {
      fflush(stdin);
      cin.clear();
      fflush(stdout);
      cout <<"请选择:1,2,或3"<<endl;
      cin >>choice;
      
    }while (!(choice == 1 || choice == 2 || choice == 3));

论坛徽章:
0
7 [报告]
发表于 2006-05-25 15:30 |只看该作者
#include <string>
#include <iostream>
#include <sstream>
using namespace std;
void
main()
{
        int             choice;
        string          mystring;
cout << " 1:刷新"<<endl;
  cout << " 2:查找"<<endl;
  cout << " 3:删除"<<endl;
        do {
                 cout <<"请选择:1,2,或3"<<endl;
                getline(cin,mystring);
                stringstream(mystring)>>choice;
        } while (!(choice == 1 || choice == 2 || choice == 3));


        switch (choice)
  {
  case 1:
     cout<< "你输入的是1"<<endl;
     break;
  case 2:
     cout<< "你输入的是2"<<endl;
     break;
  case 3:
     cout<< "你输入的是3"<<endl;
     break;
   }

}

Try this.

论坛徽章:
0
8 [报告]
发表于 2006-05-25 15:34 |只看该作者

输入字母时那个number参数为零

通过断点跟踪输入字母时那个number参数为零,所以会一直循环。深究的话我也不是很了解,估计可能是输入流和字符及整形数之间的关系了。
我修改的如下:
#include <iostream>
using namespace std;
void main()
{
  char c;
  int choice;
  cout << " 1:刷新"<<endl;
  cout << " 2:查找"<<endl;
  cout << " 3:删除"<<endl;
  do
  {
      cout <<"请选择:1,2,或3"<<endl;
      cin >>c;
          choice=c-'0';
    }while (choice>3||choice<1);
  
  
  switch (choice)
  {
  case 1:
     cout<< "你输入的是1"<<endl;
     break;
  case 2:
     cout<< "你输入的是2"<<endl;
     break;
  case 3:
     cout<< "你输入的是3"<<endl;
     break;
   }
     
}

论坛徽章:
0
9 [报告]
发表于 2006-05-25 16:25 |只看该作者

转一个帖子,说的比较详细

1. 为什么 fflush(stdin) 是错的

首先请看以下程序:

#include <stdio.h>



int main( void )

{

int i;

for (;;) {

fputs("Please input an integer: ", stdout);

scanf("%d", &i);

printf("%d\n", i);

}

return 0;

}

这个程序首先会提示用户输入一个整数,然后等待用户输入,如果用户输入的是整数,程序会输出刚才输入的整数,并且再次提示用户输入一个整数,然后等待用户输入。但是一旦用户输入的不是整数(如小数或者字母),假设 scanf 函数最后一次得到的整数是 2 ,那么程序会不停地输出“Please input an integer: 2”。这是因为 scanf("%d", &i); 只能接受整数,如果用户输入了字母,则这个字母会遗留在“输入缓冲区”中。因为缓冲中有数据,故而 scanf 函数不会等待用户输入,直接就去缓冲中读取,可是缓冲中的却是字母,这个字母再次被遗留在缓冲中,如此反复,从而导致不停地输出“Please input an integer: 2”。

也许有人会说:“居然这样,那么在 scanf 函数后面加上‘fflush(stdin);’,把输入缓冲清空掉不就行了?”然而这是错的!C和C++的标准里从来没有定义过 fflush(stdin)。也许有人会说:“可是我用 fflush(stdin) 解决了这个问题,你怎么能说是错的呢?”的确,某些编译器(如VC6)支持用 fflush(stdin) 来清空输入缓冲,但是并非所有编译器都要支持这个功能(gcc3.2不支持),因为标准中根本没有定义 fflush(stdin)。MSDN 文档里也清楚地写着fflush on input stream is an extension to the C standard(fflush 操作输入流是对 C 标准的扩充)。当然,如果你毫不在乎程序的移植性,用
fflush(stdin) 也没什么大问题。以下是 C99 对 fflush 函数的定义:

int fflush(FILE *stream);

如果stream指向输出流或者更新流(update stream),并且这个更新流
最近执行的操作不是输入,那么fflush函数将把任何未被写入的数据写入stream
指向的文件(如标准输出文件stdout)。否则,fflush函数的行为是不确定的。
fflush(NULL)清空所有输出流和上面提到的更新流。如果发生写错误,fflush
函数会给那些流打上错误标记,并且返回EOF,否则返回0。

由此可知,如果 stream 指向输入流(如 stdin),那么 fflush 函数的行为是不确定的。故而使用
fflush(stdin) 是不正确的,至少是移植性不好的。



2. 清空输入缓冲区的方法

虽然不可以用 fflush(stdin),但是我们可以自己写代码来清空输入缓冲区。只需要在 scanf 函数后面加上几句简单的代码就可以了。

/* C 版本 */

#include <stdio.h>



int main( void )

{

int i, c;

for (;;) {

fputs("Please input an integer: ", stdout);

if ( scanf("%d", &i) != EOF ) { /* 如果用户输入的不是 EOF */

/* while循环会把输入缓冲中的残留字符清空 */

/* 读者可以根据需要把它改成宏或者内联函数 */

/* 注:C99中也定义了内联函数,gcc3.2支持 */

while ( (c=getchar()) != '\n' && c != EOF ) {

;

} /* end of while */
}

printf("%d\n", i);

}

return 0;

}



/* C++ 版本 */

#include <iostream>

#include <limits> // 为了使用numeric_limits



using std::cout;

using std::endl;

using std::cin;



int main( )

{

int value;

for (;;) {

cout << "Enter an integer: ";

cin >> value;

/* 读到非法字符后,输入流将处于出错状态,

* 为了继续获取输入,首先要调用clear函数

* 来清除输入流的错误标记,然后才能调用

* ignore函数来清除输入缓冲区中的数据。 */

cin.clear( );

/* numeric_limits<streamsize>::max( ) 返回缓冲区的大小。

* ignore 函数在此将把输入缓冲区中的数据清空。

* 这两个函数的具体用法请读者自行查询。 */

cin.ignore( std::numeric_limits<std::streamsize>::max( ), '\n' );

cout << value << '\n';

}

return 0;

}

[ 本帖最后由 beizijing 于 2006-5-25 16:26 编辑 ]

论坛徽章:
0
10 [报告]
发表于 2006-05-25 19:32 |只看该作者
非常谢谢各位的赐教!
//以下是随感,可以不看

上个星期C++老师布置了一个题目(要求是面向对象).一个星期都沉迷其中!由于自己还是C语言那种结构化程序设计的思想,未能真正转变到C++上来,但又觉得自己是班上极少数能在这么短的时间里写完那400行程序的一员,颇感欣慰!心里有很强的欲望展示给同学们看,结果以为万无一失的程序被一个同学一试,他"不小心"输入了一个字符,结果.....当场一百多双的眼睛盯着我,我真想找个洞钻进去!!以后还有什么面子在班里混!
学无止境啊,要谦虚啊!!!!!想做一个程序员还有很长的一段路要走!!!!!要学的东西还有很多很多!!!!
再次谢谢各位!!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP