首页 > 学技术 > 技术网文 > C/C++ > 正文

[保留] 判断是int 还是char


来源 chinaunix.net kuqin整理

我先说一下我的意思
我想在想做一判断
这里的n要求是输入int类型的
但是如果当用户输入了其他字符不是数字
那么该如何解决?
 



 aaa()

{int n;
scanf("%d",&n);
if(n为int类型)
{执行这一段函数}
else
{递归调用aaa()重新执行函数}


[ 本帖最后由 jihuaneva 于 2006-12-30 20:46 编辑 ]



 lenovo 回复于:2006-12-30 20:35:18

用%s接收,
然后用strtod之类的函数转换。
检查转换是否完全,具体man strtod
如果有问题,再循环接收。


 jihuaneva 回复于:2006-12-30 20:38:00

引用:原帖由 lenovo 于 2006-12-30 20:35 发表
用%s接收,
然后用strtod之类的函数转换。
检查转换是否完全,具体man strtod
如果有问题,再循环接收。 



非常感谢你的回复
我只是想做一个判断
假如输入的是int类型 继续执行下面语句
如果不是提示用户输入错误
返回 要求用户重新输入

你知道如何实现吗?
我苦思不得其解


 langue 回复于:2006-12-30 20:48:34

自己写函数吧。


 whyglinux 回复于:2006-12-30 21:22:00

也可以这样实现:
  int n;

  int ret;

  do {
    printf( "Input an integer: " );
    ret = scanf( "%d", &n );
    while ( getchar() != '\n' ); /* Clear the input buffer */
  } while ( ret != 1 );

  /* 执行这一段函数 */



 flw2 回复于:2006-12-30 21:43:46

检查返回值


 cjaizss 回复于:2006-12-30 21:45:21

scanf的返回值


 jihuaneva 回复于:2006-12-30 21:50:56

非常感谢楼上的朋友
帮我解决了这个问题

下面我将我的这个例子打出来,供大家参考
其中应用到了whyglinux 
提供的这个算法





#include <stdio.h>

#include <stdlib.h>
#define MAX 100
#define NULL 0
struct list                      /*定义顺序表存储结构*/
{int data_list[MAX];
int last;
};
typedef struct list LIST;

LIST createlist(void)           /*创建顺序表*/
{LIST sqlist;
int i,x,ret;
printf("\n****此步操作为输入顺序表的长度******************** ");
printf("\n****注意如果你输入的为非int类型,将自动重新输入****\n");
do {
    printf("在这里输入长度---->>> " );
    ret = scanf( "%d", &sqlist.last );
    while ( getchar() != '\n' );
  } while ( ret != 1 );

fflush(stdin);
printf("\n↓请输入顺序表的数据<int型>↓\n");
 for(i=1;i<=sqlist.last;i++)
 {printf("输入第%d个数据:",i);
  scanf("%d",&x);
  sqlist.data_list=x;
 }
  return(sqlist);
}


void outlist(LIST l)           /*输出顺序表*/
 {int i;
  printf("\n顺序表的长度:%d\n",l.last);
  printf("顺序表的数据:");
  for(i=1;i<=l.last;i++)
  printf("%d   ",l.data_list);
  printf("\n");
 }

  LIST inslist(LIST l,int i,int x)   /*顺序表插入 i表示插入位置 x表示插入的数据*/
 {int j;
  if(l.last>MAX)
  {printf("\n顺序表已满!!\n");
  return(l);}
  else if(i<1||i>l.last)
  {printf("\n插入的位置出错!!\n");
  return(l);}
  else{
  for(j=l.last;j>=i;j--)
   l.data_list[j+1]=l.data_list[j];
  l.data_list=x;
  l.last++;
  return(l);}
 }

 LIST delist(LIST l,int i)          /*顺序表删除 i表示删除位置*/
{int j;
 if(i<1||i>l.last)
 {printf("\n删除出错!!\n");
 return(l);}
  else
  {for(j=i+1;j<=l.last;j++)
 l.data_list[j-1]=l.data_list[j];
 l.last--;
 return(l);}
 }


void main()                   /*实验一:顺序表的基本运算*/
{ LIST a;
 int i,x,j;
 a=createlist();
 outlist(a);
 printf("\n请输入插入位置:");
 scanf("%d",&i);
 printf("\n请输入插入数据:");
 scanf("%d",&x);
 a=inslist(a,i,x);
 outlist(a);
 printf("\n请输入删除数据的位置:");
 scanf("%d",&j);
 a=delist(a,j);
 outlist(a);
}


 



 mtx99 回复于:2006-12-30 22:11:09

我在sun solaris9(sparc)平台下,试过,用判断长度的办法来实现,char长度是1个字节,int是4个字节。这样就可以判断出来了。
   printf("size of char:%d\n",sizeof(char));
     printf("size of int:%d\n",sizeof(int));

   size of char:1
     size of int:4,
   当然这个方法可能不适合其它的平台。


 whyglinux 回复于:2006-12-30 22:29:14

注意:C 标准没有规定 fflush(stdin); 的行为,所以在 Linux 等平台下其行为可能是没有定义的。为了保证程序的移植性,最好不要使用 fflush(stdin);,而应该用其它方式实现对输入缓冲的清除。比如我上面提到的 while ( getchar() != '\n' );  这种方法。


 wyaccent 回复于:2006-12-31 10:42:08

可以判断输入的ASC码,0x30---0x39是数字


 jihuaneva 回复于:2006-12-31 12:34:46

引用:原帖由 whyglinux 于 2006-12-30 22:29 发表
注意:C 标准没有规定 fflush(stdin); 的行为,所以在 Linux 等平台下其行为可能是没有定义的。为了保证程序的移植性,最好不要使用 fflush(stdin);,而应该用其它方式实现对输入缓冲的清除。比如我上面提到的 wh ... 




感谢 whyglinux

我的这个程序是在VC下面做的
你提供的那个算法
我应用在
当要求用户输入一个表长(int类型)
但是如果用户要是误操作了
输入了一个非int类型
那么要求用户重新输入
之前输入的那个非int类型无效
然后重新输入
在将这个重新输入的int类型
付给 sqlist.last
然后继续执行

不过这个算法确实很好



 jihuaneva 回复于:2006-12-31 12:51:18

在这里我想解释一下whyglinux的这段程序


 int n;
  int ret;

  do {
    printf( "Input an integer: " );
    ret = scanf( "%d", &n );
    while ( getchar() != '\n' ); /* Clear the input buffer */
  } while ( ret != 1 );

  /* 执行这一段函数 */

当用户如果输入一个数字的时候,那么这个时候n定义的是一个整型就将这个整型接收
ret = scanf( "%d", &n );的意思不等于ret=n;
而是当n接收到一个整型值时候ret=1;
while ( ret != 1 );跳出循环
如果当用户输入一个字符类型的数据,那么这个时候 n已定义为一个整型就无法接收了
所以n没有接收到值此时候ret=0;
而getchar正是来接受字符的,当用户输入了回车('\n')后接收完毕
跳出while ( getchar() != '\n' ); 注意这里的while 顺环体为空语句

这个时候while ( ret != 1 );(因为ret=0,条件为真继续执行该循环)
所以说如果你输入了一个非int类型
那么接下来的又会
printf( "Input an integer: " );
ret = scanf( "%d", &n );
(直到输入为int类型止)



如果我解释的有错误请大家指出来
也有可能该算法不止这些
还有其他功能
也希望大家能继续发挥
我应用到这个算法就是这样的


[ 本帖最后由 jihuaneva 于 2006-12-31 12:53 编辑 ]


 tyc611 回复于:2006-12-31 17:09:20

给版主建议:
既然保留该贴,那应该改下标题,比如:“C中输入缓冲区的清空”,或者“C中输入错误处理”
:mrgreen:


 jamesbang2003 回复于:2007-01-26 09:59:53

我知道大家讨论的是输入一个数字,但是我想输入一个两位以上的数,比如输入10,ok,输入1e,报错,怎么处理。


 cymx2002 回复于:2007-01-26 12:13:30

大家其实不用这么麻烦,man isdigit
楼主如果要判断多位数字,可以先放到一个数组里面,
然后再一位一位的判断是不是数字即可。


 cymx2002 回复于:2007-01-26 12:38:22

而且楼主帖子的标题就不对。
是不是数字和它的类型是没有关系的。
至少isdigit这个函数是这样的。
所以
引用:aaa()
{int n;
scanf("%d",&n);
if(n为int类型)


应该为if(n为数字)!!
mtx99老兄用sizeof的方法,估计
是误解了楼主的本意了。


 whyglinux 回复于:2007-01-26 20:22:38

引用:原帖由 cymx2002 于 2007-1-26 12:13 发表
大家其实不用这么麻烦,man isdigit
楼主如果要判断多位数字,可以先放到一个数组里面,
然后再一位一位的判断是不是数字即可。 



这样反而要更麻烦些。




原文链接:http://bbs.chinaunix.net/viewthread.php?tid=879113
转载请注明作者名及原文出处



收藏本页到:      

收藏本页到: