zoukankan      html  css  js  c++  java
  • c语言防止缓冲区数据作为有效字符被读入

    常见的防止将数据输入时存入缓冲区中的回车符读入下一个字符变量的方法是
    1.用函数getchar()将回车符先读入,防止成为下一个字符型变量的有效字符。
    2.在%c前面加一个空格,忽略前面数据输入时存入缓冲区中的回车符,避免被后面的字符型变量当成有效字符读入。
     1 int main(){
     2     int a;
     3     char b;
     4     printf("Please input an integer:");
     5     scanf("%d",&a);
     6     printf("intnger:%d",a);
     7     getchar();//将存于缓冲区中的回车符读入,避免在后面作为有效字符读入
     8     printf("Please input a char:");
     9     scanf("%c",&c);
    10     //或者使用scanf(" %c",&c);效果与getchar()一样
    11     printf("char=%c
    ",c);
    12 }

     
     当我们需要连续从键盘键入两个字符型数组的时候,为了防止缓冲区溢出,我们使用了安全函数 char *fgets(char *s,int n,stdin)。但是出现问题。
     下面的代码就是初始代码,
     1 #include<stdio.h>
     2 #include<stdlib.h>
     3 
     4 
     5 int main(int argc,char *argv[]){
     6 
     7 
     8     char str[10];
     9     char str2[10];
    10     char c;
    11     printf("请输入str:");
    12     fgets(str,10,stdin);
    13 
    14     printf("请输入str2:");
    15     fgets(str2,10,stdin);
    16 
    17 
    18     printf("str=%s
    ",str);
    19     printf("str2=%s
    ",str2);
    20 
    21 
    22    
    23  return 0;
     
     

    运行之后发现

    结果:
    请输入str:abcdefghjklmn
    请输入str2:str=abcdefghj
    str2=klmn
    然而这并不是我们所需要的结果,str2数组将缓冲区中str没有读完的数据当成有效字符读入了,这就让我们无法键入str2的值,因此为了解决这个问题。让我们能够正常键入第二个变量。于是有了改进版:
     
     1 #include<stdio.h>
     2 #define N 10
     3 int main(int argc,char *argv[]){
     4 
     5 
     6     char str[N];
     7     char str2[N];
     8     char c;
     9     printf("请输入str:");
    10     fgets(str,10,stdin);
    11 
    12     while((c=getchar())!='
    '&&c!=EOF); //清空输出流
    13     clearerr(stdin);//  清楚流的错误标记
    14 
    15     printf("请输入str2:");
    16     fgets(str2,10,stdin);
    17 
    18 
    19     printf("str=%s
    ",str);
    20     printf("str2=%s
    ",str2);
    21 
    22 
    23     return 0;
    24 }

    运行结果

    请输入str:abcdefghijklmn
    请输入str2:abcdefghijklmn
    str=abcdefghi
    str2=abcdefghi
  • 相关阅读:
    hdu2112 HDU Today 基础最短路
    HDU 4597 Play Game(记忆化搜索,深搜)
    HDU 4496 D-City(并查集,逆思维)
    集训心情记录,,,,(2014.6.20-6.29)
    ZOJ 1115 Digital Roots(简单,字符串与数)
    ZOJ 2971 Give Me the Number;ZOJ 2311 Inglish-Number Translator (字符处理,防空行,strstr)
    HDU 3623 Best Cow Line, Gold(模拟,注意思路,简单)
    poj 3903 Stock Exchange(最长上升子序列,模版题)
    POJ 3253 Fence Repair(优先队列,哈夫曼树,模拟)
    hdu 2571 命运(递推,请小心)
  • 原文地址:https://www.cnblogs.com/cmustard/p/6769950.html
Copyright © 2011-2022 走看看