2013-07-13 94 views
6

如果我輸入的str1長度大於10,那麼剩下的部分保留在緩衝區中並輸入我的str2。如何在str2之前清除緩衝區,以便我可以輸入它?如何在接收多個字符串時清除緩衝區?

#include <stdio.h> 
int main(void) 
{ 
    char str1[10]; 
    char str2[10]; 
    fgets(str1,10,stdin); 
    fgets(str2,10,stdin); 

    puts(str1); 
    puts(str2); 
    return 0; 
} 
+0

使用「fflush(標準輸入)」 –

+5

@NithinBhaskar號 – jamesdlin

+0

我嘗試了前面,它不工作。 – dushyantashu

回答

2

fgets(str1,10,stdin);後做

while((c = getchar()) != '\n' && c != EOF); 

這種 'STR1' 被讀取後,將清除輸入緩衝區。

所以,你的代碼應該是

#include <stdio.h> 
int main() 
{ 
    char str1[10]; 
    char str2[10]; 
    int c; 
    str1[0]=0; 
    str2[0]=0; 
    fgets(str1,10,stdin); 
    if((str1[0]!=0) && (!strrchr(str1,'\n'))) 
     while((c = getchar()) != '\n' && c != EOF); 
    fgets(str2,10,stdin); 
    puts(str1); 
    puts(str2); 
    return 0; 
} 
+0

如果第一個內有'\ n'',該怎麼辦10個字符的輸入? –

+0

@JimBalter感謝您指出。做了必要的編輯。 –

+0

不過,你不測試'fgets'的返回值;你可以訪問一個未初始化的'str1'(例如,用於空輸入)。 – Jens

-1
#include <stdio.h> 

#define MAX_LEN 9 
#define READBUF_LEN 4092 

int main(void) 
{ 
    char str1[MAX_LEN+1]; 
    char str2[MAX_LEN+1]; 
    char readbuf[READBUF_LEN+1]; 

    fgets(readbuf,READBUF_LEN,stdin); 
    strncpy(str1, readbuf,MAX_LEN); 
    str1[MAX_LEN]='\0'; 

    fgets(readbuf,READBUF_LEN,stdin); 
    strncpy(str2, readbuf,MAX_LEN); 
    str2[MAX_LEN]='\0'; 

    puts(str1); 
    puts(str2); 
    return 0; 
} 

是啊,我知道,如果有人進入超過4092個字符...有這種情況發生的一個很大的機會。

0

一種不同的方式:避免fgets(),並逐個閱讀字符。這使您可以處理一個循環內的所有條件:

int main(void) 
{ 
    char str1[12]; 
    char str2[13]; 
    size_t pos; 
    int ch; 

    for (pos=0;;) { 
     ch = getc(stdin); 
     if (ch == '\n' || ch == EOF) break; 
     if (pos < sizeof str1 -1) str1[pos++] = ch; 
     } 
    str1[pos] = 0; 

    for (pos=0;;) { 
     ch = getc(stdin); 
     if (ch == '\n' || ch == EOF) break; 
     if (pos < sizeof str2 -1) str2[pos++] = ch; 
     } 
    str2[pos] = 0; 

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

    return 0; 
}