Program wybierający najdłuższy wiersz spośród wpisanych

0
 #include <stdio.h>

#define MAXLINE 1000

int getline(char line[], int maxline);
void copy(char to[],char from[]);

int main ()
{
    int len,max;
    char line[MAXLINE];
    char longest[MAXLINE];

    max = 0;
    while ((len = getline(line,MAXLINE)) >0)
    if (len>max) {
        max=len;
        copy(longest, line);
    }

    if (max>0)
        printf("%s", longest);
    return 0;
}
int getline(char s[], int lim)
{
    int c,i;

    for(i=0;i<lim-1 && (c=getchar())!=EOF && c!='\n';++i)
        s[i]=c;
    if (c == '\n'){
        s[i]=c;
        ++i;
    }
    s[i]='\0';
    return i;
}

void copy(char to[], char from[])
{


 int i;
 i=0;
 while((to[i] = from[i])!='\0')
    ++i;
    }

Uczę się z książki "Język ANSI C" i mam wielki problem, gdyż większość rzeczy albo omawiana jest pobieżnie albo wcale i nie mogę zrozumieć pewnych rzeczy (linijek) w tym programie.
Wyżej znajduje się cały kod, który został przepisany z książki, zaś poniżej będe wymieniał te rzeczy których nie rozumiem i byłbym wdzięczny za pomoc w zrozumieniu ich.

  while ((len = getline(line,MAXLINE)) >0)

Co ta linijka konkretnie oznacza ?
Wiem, że to pętla, ale chodzi o to, że tablica 'line[]' równa się teraz 'line' ? I co to mi daje, bo nie mogę tego zrozumieć.

for(i=0;i<lim-1 && (c=getchar())!=EOF && c!='\n';++i) 

'lim-1' co to oznacza co to jest lim ? Musi mieć jakąś wartosć a nie widzę by program, bądź ja za pomocą klawiatury wproawdzał jakąś wartosć temu...

0
int getline(char s[], int lim)
{ 
...
    for(i=0;i<lim-1 && (c=getchar())!=EOF && c!='\n';++i)
...
}

lim jest tutaj argumentem przekazanym do funkcji, warunkiem petli jest spelnienie koniunkcji

while ((len = getline(line,MAXLINE)) >0)

while czyli petla. while(WARUNEK). warunkiem jest tutaj len > 0. len zostanie zainicjowany wartoscia zwrocona przez funkcje geline()

0

Dobrze może zacznijmy od początku.

Po uruchomieniu programu muszę napisać jakiś wiersz odpowiada za to funkcja

 int getline(char s[], int lim)
{
    int c,i;
 
    for(i=0;i<lim-1 && (c=getchar())!=EOF && c!='\n';++i)
        s[i]=c;
    if (c == '\n'){
        s[i]=c;
        ++i;
    }
    s[i]='\0';
    return i;
}

Zmienna 'i' równa się liczbie znaków w wierszy dopóki nie zostanie naicśnięty ctrl+z albo enter(jeżeli zostanie on naciśnięty, to dolicza znak.) ale co oznacza ta wartość 'i<lim-1' ?

0

Dopiero zaczynam z programowaniem, wiec nie za bardzo to wszystko ogarniam. Korzystam z ksiazki Jezyk ANSI C i tam tak bylo napisane i chcialem dobrze zrozumiec dzialanie tego programu by moc sam korzystac z tego potem.

0

K&R2, tak? Poznaję po ich funkcji getline. To co jest w niej fajne, to to, że zwraca Ci długość cstringa - czego niestety nie ma fgets - więc informację o długości linii masz na tacy.

i<lim-1 && (c=getchar())!=EOF && c!='\n' to jest warunek, który musi być spełniony, żeby pętla się kręciła. ;)
Czytaj:
kręć pętlą jeżeli:
i jest mniejsze od lim - 1 //innymi słowy s[i] to ciągle prawidłowa wartość w naszym buforze, jeśli ten warunek jest niespełniony - linia była dłuższa niż nasz bufor
ORAZ c (które teraz przyjmuje wartość zwracają przez getchar()) nie jest równe EOF
ORAZ c nie jest równe '\n'

0

a co to jest to lim - 1 ? Gdzie jest to zdefiniowane ? Czyli musi mieć jakąs wartosć skoro od tego odejmujemy -1...

0

No to rozumiem, ale ile tutaj wynosi to 'lim' ?

0

Ile sobie ustawisz (t.j. tyle ile sobie przeznaczysz miejsca w buforze). Ty to ustawiasz.

0

No popatrz uważnie na funkcję... lim (który swoją drogą powinien być size_t, a nie int) to jest "limit", czyli rozmiar bufora s.

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