1. 程式人生 > >c語言防止緩衝區資料作為有效字元被讀入

c語言防止緩衝區資料作為有效字元被讀入

常見的防止將資料輸入時存入緩衝區中的回車符讀入下一個字元變數的方法是
1.用函式getchar()將回車符先讀入,防止成為下一個字元型變數的有效字元。
2.在%c前面加一個空格,忽略前面資料輸入時存入緩衝區中的回車符,避免被後面的字元型變數當成有效字元讀入。
int main(){
    int a;
    char b;
    printf("Please input an integer:");
    scanf("%d",&a);
    printf("intnger:%d",a);
    getchar();//將存於緩衝區中的回車符讀入,避免在後面作為有效字元讀入
    printf
("Please input a char:"); scanf("%c",&c); //或者使用scanf(" %c",&c);效果與getchar()一樣 printf("char=%c\n",c); }
 當我們需要連續從鍵盤鍵入兩個字元型陣列的時候,為了防止緩衝區溢位,我們使用了安全函式 char *fgets(char *s,int n,stdin)。但是出現問題。
 下面的程式碼就是初始程式碼,
#include<stdio.h>
#include<stdlib.h>


int main(int argc,char
*argv[]){ char str[10]; char str2[10]; char c; printf("請輸入str:"); fgets(str,10,stdin); printf("請輸入str2:"); fgets(str2,10,stdin); printf("str=%s\n",str); printf("str2=%s\n",str2); return 0;

執行之後發現

結果:
請輸入str:abcdefghjklmn
請輸入str2:str=abcdefghj
str2=klmn
 然而這並不是我們所需要的結果,str2陣列將緩衝區中str沒有讀完的資料當成有效字元讀入了,這就讓我們無法鍵入str2的值,因此為了解決這個問題。讓我們能夠正常鍵入第二個變數。於是有了改進版:
#include<stdio.h>
#define N 10
int main(int argc,char *argv[]){


    char str[N];
    char str2[N];
    char c;
    printf("請輸入str:");
    fgets(str,10,stdin);

    while((c=getchar())!='\n'&&c!=EOF); //清空輸出流
    clearerr(stdin);//  清楚流的錯誤標記

    printf("請輸入str2:");
    fgets(str2,10,stdin);


    printf("str=%s\n",str);
    printf("str2=%s\n",str2);


    return 0;
}

執行結果

請輸入str:abcdefghijklmn
請輸入str2:abcdefghijklmn
str=abcdefghi
str2=abcdefghi