Witam. Kontynuując moje poznawanie języka C z książki ANSI C doszedłem do rozdziału o funkcjach. Był tam program szukający najdłuższego wiersza, wpisujący go do tablicy a potem wyświetlający go. Problemem było to, że w oryginalnej wersji programu była stała MAX która określała wielkość tablicy. W ramach ćwiczenia miałem poprawić główną część programu tak by nie było problemu z ograniczoną pojemnością tablic w sensie "Popraw główną funkcję programu szukającego najdłuższego wiersza, tak, aby program zawsze poprawnie wypisywał rozmiar dowolnie długich wierszy i tylko tyle tekstu, ile jest możliwe." Napisałem więc ten program w taki sposób:
#include <stdio.h>
#include <stdlib.h>
int getline(char l[],int m);
void copy(char to[],char from[]);
int maxline();
int main()
{
int l,max,n;
n=0;
max=maxline();
char line[max],longest[max];
while((l=getline(line,max))>0){
if(l>n){
n=l;
copy(longest,line);
}
}
if(n>0)
printf("%s",longest);
else
printf("brak wierszy\n");
return 0;
}
int getline(char l[],int m){
int c,i;
for(i=0;i<m-1&&(c=getchar())!=EOF&&c!='\n';++i)
l[i]=c;
if(c=='\n'){
l[i]=c;
++i;
}
l[i]='\0';
return i;
}
void copy(char to[],char from[]){
int i;
i=0;
while((to[i]=from[i])!='\0')
++i;
}
int maxline(){
int c,i,n;
n=0;
for(i=0;(c=getchar())!=EOF;++i){
if(c=='\n'){
if(i>n)
n=i;
i=0;
}
}
return n+1;
}
Dodałem funkcje maxline sprawdzającą jaka jest długość najdłuższego wiersza i zwracająca tą wartość większą o jeden by w tablicy zmieścił się dodatkowo znak '\0'
. Na podstawie tej wielkości generuje odpowiednio duże tablice i reszta powinna działać jak należy gdyż wprowadzone zmiany były małe (działa wszystko na tej samej zasadzie tylko jest uzależnione od zmiennej max zamiast stałej MAX). Problem w tym, że program nie działa teraz prawidłowo a ja nie rozumiem czemu. Z przeprowadzonych testów wynika, że prawdopodobnie problem siedzi w funkcji getline która z jakiegoś powodu ciągle zwraca 0.
Mały update
Zastanawiałem się czy może problem nie polega na konflikcie funkcji getline zadeklarowanej przeze mnie z znajdującą się już w bibliotekach ale zmiana nazwy funkcji nic nie zmieniła.