流和缓冲区的理解及标准输入的解决方法

  • 发布于:2023-11-10
  • 137 人围观
   先看两个问题(以下程序运行环境为WIN2000+DEV-C++4.9.9.2):
1、执行以下程序:
代码:
/*****************************************************
Name: copy_bar.c
Copyright: kernelxu
Author: kernelxu
Date: 2005-08-02 11:20
Description: show the progress bar while doing copy
****************************************************/

#include <stdio.h>

int main(void)
{
char c = '\0';
int i = 0;
long j = 0L;

putchar('\n');
puts("Copy?(y/n): \n");
for (; (c = getchar()) == 'y' || c == 'Y'; )
{
printf("Coping......");
for (i = 0; i <= 100; i++)
{
printf("%%%3d", i);
printf("\b\b\b\b");
j = 0L;
while (j < 20000000)
{
j++; /*delay相当于linux中sleep(n)*/
}
}
puts("\nFinished!\n");
puts("Copy?(y/n): \n");
}
system("pause");

return 0;
}

该程序实现一项简单的状态条显示功能(当然只是玩玩而已),但是它不能循环进行下去,程序执行一次循环就跳出了。

2、
代码:
/*****************************************************
Name: login_example.c
Copyright: kernelxu
Author: kernelxu
Date: 2005-08-02 14:17
Description: taking login for example to say sth about I/O buffer
*****************************************************/


#include <stdio.h>
#include <string.h>
#define NAME_MAX 10
#define USER_NAME "kernelxu\0"
#define PASS_WORD 123456

int main(void)
{
char userName[NAME_MAX] = {'\0'};
unsigned long passWord = 0UL;


for(; ; )
{
printf("Login:");
gets (userName);
printf("Password:");
scanf("%ld", &passWord);
if(passWord != PASS_WORD || strcmp(userName, USER_NAME) != 0)
{
printf("Login Incorrect!\n");
continue;
}
break;
}
printf("[%s@localhost ~]$", userName);
getch();

return 0;
}

该程序只要输入的用户名超过NAME_MAX-1值或者password输入的不是正整数,就无法登录了。

以上两例程序之所以存在很大的问题,主要是在处理标准输入缓冲及选择输入函数上不够慎重。本文先总结一下流(stream)、缓冲区(buffer)的概念,然后重点说一下这类问题的解决之道。
万企互联
标签: