Chinaunix首页 | 论坛 | 博客
  • 博客访问: 344803
  • 博文数量: 82
  • 博客积分: 2602
  • 博客等级: 少校
  • 技术积分: 660
  • 用 户 组: 普通用户
  • 注册时间: 2007-08-10 08:48
文章分类

全部博文(82)

文章存档

2008年(17)

2007年(65)

分类: C/C++

2007-10-18 08:59:13

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类型止)

 

应用:

 

#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↓请输入顺序表的数据↓\n");
for(i=1;i<=sqlist.last;i++)
{printf("输入第%d个数据:",i);
  scanf("%d",&x);
  sqlist.data_list[i]=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[i]);
  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[i]=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);
}


whyglinux:

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