2013-07-13 9 views
6

Jeśli wprowadzę str1 dłużej niż długość 10, reszta pozostanie w buforze i zostanie wprowadzona do mojego str2. Jak wyczyścić bufor przed str2, aby go wprowadzić?Jak wyczyścić bufor podczas odbierania wielu ciągów?

#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

użytku „fflush (stdin)” –

+5

@NithinBhaskar nr – jamesdlin

+0

próbowałem go wcześniej, to nie działa. – dushyantashu

Odpowiedz

2

Po fgets(str1,10,stdin); zrobić

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

To wyczyścić bufor wejściowy po 'str1' jest czytana.

więc kod powinien być

#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

Co zrobić, jeśli w ciągu pierwszego jest '\ n'' 10 znaków wejściowych? –

+0

@JimBalter Dzięki za wskazanie. Dokonano niezbędnej edycji. –

+0

Nadal nie testujesz zwrotu z 'fgets'; możesz uzyskać dostęp do niezainicjowanego 'str1' (na przykład dla pustych danych wejściowych). – 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; 
} 

Tak, wiem, co zrobić, jeśli ktoś wejdzie więcej niż 4092 znaków ... Jest duża szansa, że ​​dzieje.

0

Inny sposób: unikaj fgetów() i czytaj znaki jeden po drugim. To pozwala obsłużyć wszystkie warunki wewnątrz jednej pętli:

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; 
}