Zadanie z książki Język ANSI C

0

Cześć, mam problem z pewnym zadaniem, jego treść jest następująca:

Napisz program wypisujący, wszystkie wiersze wejściowe dłuższe niż 80 znaków.

Mój kod wygląda następująco:

#include <stdio.h>

#define MAXLINE 1000 /*maksymalny rozmiar wiersza*/

int qetline(char line[], int maxline);

int main()
{
    int len;    /*długość bieżącego wiersza*/
    char line[MAXLINE]; /*bieżący wiersz z wejścia*/
 
   
 
    while ((len = qetline(line, MAXLINE))>0)
    {   if(len>80){
          
            printf("%s\n",line);
        }
    
    }

    return 0;

}

/*getline: wczytaj wiersz do s, podaj jego długość*/
int qetline(char s[], int lim)
{
    int c, i, dlugosc;
    
    for(i = 0; i<lim-1&&(c = getchar())!=EOF&&c != '\n'; ++i)
    {
        s[i]=c;
    }
    if(c=='\n'){
        s[i];
        dlugosc = i;
        ++i;

    }
    s[i]='\0';
    return i;
    
    
}

Problem, jest taki, że mój program jeżeli długość wiersza jest dłuższa od razu wypisuje ponownie wiersz, a chciałbym aby przechowywał wiersze o długości powyżej 80 znaków i wypisywał je dopiero po wprowadzeniu wszystkich wierszy. Domyślam się, że każdy wiersz trzeba wczytać do tablicy, i potem ją wypisać, ale mam problem z implementacją tego.

0

W miejscu

printf("%s\n",line);

musisz budować tablicę z wynikami, którą na koniec programu wyświetlisz w kolejnej pętli ( i zwiększać licznik wyników ).
Na początku musisz zadeklarować nową tablicę oraz zmienną int, która będzie licznikiem wyników.

0

Jeśli chcesz przechować w pamięci, to zostają dynamiczne struktury danych, tak więc zapoznanie się z dynamicznym zarządzaniem pamięci. Przy okazji zamiast pisać int qetline(char s[], int lim), można użyć funkcji fgets...Kolejna uwaga, to i tak ograniczasz wielkość tablicy do 1000 znaków, więc linia dłuższa też będzie błędnie wypisana.

0

Po pierwsze wystarczy tyle:

#include <stdio.h>

#define MAXLINE 1024

int main()
{
    char line[MAXLINE+1],fmt[16];
    int ch;
    sprintf(fmt,"%%%d[^\n]s",MAXLINE);
    while(scanf(fmt,line)==1)
    {
        if(strlen(line)>80) printf("%s\n",line);
        while(((ch=getchar())!='\n')&&(ch!=EOF)) {}
    }
    return 0;
}

Po drugie nie musisz oddzielać wejscia standardowego od wyjscia, to tylko na ekranie się miesza.
Po trzecie jak już chcesz rozdzielac to możesz to zrobić tak:

#include <stdio.h>
#include <string.h>

#define MAXLINE 1024
#define MAXBUFF 16*1024

int main()
{
    char whole[MAXBUFF+2]={0},line[MAXLINE+1],fmt[16];
    int ch,size=0,add;
    sprintf(fmt,"%%%d[^\n]s",MAXLINE);
    while(scanf(fmt,line)==1)
    {
        while(((ch=getchar())!='\n')&&(ch!=EOF)) {}
        add=strlen(line);
        if(add>80)
        {
            if(size+add>=MAXBUFF) exit(1); // brak zarezerwowanego bufora
            strcpy(whole+size,line);
            strcpy(whole+size+add,"\n");
            size+=add+1;
        }
    }
    whole[size]=0;
    printf("%s",whole);
    return 0;
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1