[C] Najdłu?ższy wiersz

0

Dopiero ucze sie programowac w C i korzystam z książki Klasyka Informatyki "Język ANSI C". Doszedłem do rozdziału 1.9 Tablice znakowe i przepisałem przykład tam podany. Powinien on wypisywac nadłuższy wiersz, ale nie wiem dlaczego u mnie kompiluje sie i koniec, nic wiecej nie robi. Nie wiem czy moze cos przegapilem przy przepisywaniu, czy moze jest jakis inny powod. Mam nadzieje ze ktos mi pomoże.

#include <stdio.h>

#define MAXLINE 1000

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

main()
{
  int len;
  int 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];
   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;
}
0

pewnie zle przepisales, mi sie wydaje, ze powinno byc:

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

A do tego, ze program na poczatku nic nie robi to dobrze, bo to Ty masz robic, czyli wpisywac wiersze i jak Ci sie znudzi to znak konca pliku (dla DOS/Win to chyba Ctrl-Z na poczatku wiersza) i wtedy program wypisze Ci najdluzszy z wprowadzonych. Mozesz tez przekierowac na wejscie programu jakis plik tekstowy jak Ci sie nie chce pisac.

0

Wielkie dzieki. Teraz juz wszystko dzial :) Pomylka przy przeisywaniu.

0

Cześć, trochę odświeżę ten temat. Do tego programu jest zadanie o treści: "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." Czy ktoś udzieli może jakiejś wskazówki?

0
prove napisał(a):

"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."

Odnośnie tego jeżeli dobrze rozumiem poczytaj o malloc, realloc i free. a możesz też nie męczyć się i skorzystać z getline z _GNU_SOURCE mniej więcej http://ideone.com/iUP5jG . z tym, że czyta dopoki enter i wycina z koncowki wiersza '\n' . zamiast free i strdup można byłoby napisać funkcję na realloc, ale nie chciało mi się.

1
  1. Dodaj zmienną Realny_Rozmiar.
  2. Przed tym if (c=='\n'){ ustaw: Realny_Rozmiar=i;
  3. Dodaj else if(c!=EOF) w którym czytaj dalej do EOF lub '\n' i zwiększaj Realny_Rozmiar
  4. Zwróć Realny_Rozmiar.
0

A czy nie da się tego zrobić jakoś prościej? To jest zadanie z książki "Język ANSI C" i jest zadane w momencie, gdzie autor stosuje tylko jedną bibliotekę mianowicie stdio.h i posługuje się podstawami języka C...

Nie wiem, czy dobrze zrozumiałam...

int getline(char s[], int lim){
  int c, i;

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

Ok, a tak jeszcze dla pewności, efekt końcowy ma być taki?

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

Hmmm....?

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

Zamiast: ++i; wstaw: realny_rozmiar=++i;

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