• 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
  • 相关阅读:
    swoole创建进程
    php中,posix_getpid() 和 getmypid() 有什么不同
    php查看进程
    初探PHP多进程
    nginx转发
    mime类型
    acwing 517. 信息传递
    LeetCode 1255 得分最高的单词集合 Maximum Score Words Formed by Letters
    LEETCODE 1254 统计封闭岛屿的数目 Number of Closed Islands
    算法问题实战策略 SORTGAME
  • 原文地址:https://www.cnblogs.com/cmustard/p/6769950.html
Copyright © 2020-2023  润新知