• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Funkcja getline w C

0 głosów
4,654 wizyt
pytanie zadane 27 grudnia 2015 w C i C++ przez Karol_K Nowicjusz (210 p.)

Jest to program z książki "ANSI C Programowanie". Ma on za zadanie odczytać zbiór wierszy i wypisać najdłuższy z nich :

#include <stdio.h>

#define MAXLINE 1000 /* dopuszczalna długość wiersza danych wejściowych */

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

/* wypisywanie najdłuższego wiersza danych wejściowych */
main()
{
        int len; /* długość bieżącego wiersza */
        int max; /* największa znana długość */
        char line[MAXLINE]; /* bieżący wiersz wejścia */
        char longest[MAXLINE]; /* najdłuższy wiersz */

	max = 0;
	while ((len = getline(line, MAXLINE)) > 0)
		if (len > max)
		{
			max = len;
			copy(longest, line);
		}
	if (max > 0) /* dane zawierały co najmniej jeden wiersz */
		printf("%s", longest);
	return 0;
}

/* getline: pobiera wiersz do tablicy s, zwraca długość */
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;
}

/* copy: kopiuje 'from' do 'to', zakłada wystarczający rozmiar */
void copy(char to[], char from[])
{
	int i;

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

Przy kompilacji wyświetla komunikat :

longestline.c:5:5: error: conflicting types for ‘getline’
 int getline(char line[], int maxline);
     ^
In file included from longestline.c:1:0:
/usr/include/stdio.h:678:20: note: previous declaration of ‘getline’ was here
 extern _IO_ssize_t getline (char **__restrict __lineptr,
                    ^
longestline.c:29:5: error: conflicting types for ‘getline’
 int getline(char s[], int lim)
     ^
In file included from longestline.c:1:0:
/usr/include/stdio.h:678:20: note: previous declaration of ‘getline’ was here
 extern _IO_ssize_t getline (char **__restrict __lineptr,
                    ^

Po zmianie nazwy funkcji "getline" na np. "getlin" program działa poprawnie. Czy da się to jakoś ominąć stosując nazwę funkcji "getline"?

1 odpowiedź

0 głosów
odpowiedź 27 grudnia 2015 przez Krawiec91 Pasjonat (19,600 p.)
wybrane 28 grudnia 2015 przez Karol_K
 
Najlepsza
Zmień nazwy parametrów formalnych w prototypie funkcji getline(), bo są różne od tych w definicji funkcji getline().
Albo zostaw same typy parametrów w prototypie.
komentarz 27 grudnia 2015 przez Karol_K Nowicjusz (210 p.)
Dzięki za odpowiedź, ale nadal nie działa :/
komentarz 27 grudnia 2015 przez Krawiec91 Pasjonat (19,600 p.)
Jaki system i jaki kompilator? getline() jako takie, nie należy do funkcji ze standardowej biblioteki języka C. Aczkolwiek widziałem, że przy Linuxie ta funkcja się pojawia.
Testowałem u siebie (Win7 x64 i kompilator GCC), żadnych błędów ani warningów nie było.
komentarz 27 grudnia 2015 przez adrian17 Mentor (354,880 p.)
getline() jest na Linuxie, jest też w standardzie POSIX. Duży błąd ze strony książki, że użyli nazwę powszechnie używanej funkcji.

Po prostu zmień nazwę na my_getline czy cokolwiek chcesz.
komentarz 28 grudnia 2015 przez Krawiec91 Pasjonat (19,600 p.)
Książka sprzed prawie 30 lat (1988), jeśli chodzi o oryginał.

Podobne pytania

0 głosów
1 odpowiedź 346 wizyt
pytanie zadane 29 marca 2020 w C i C++ przez dominik195k Obywatel (1,030 p.)
0 głosów
4 odpowiedzi 1,737 wizyt
pytanie zadane 5 grudnia 2016 w C i C++ przez Hvosz Początkujący (410 p.)
0 głosów
2 odpowiedzi 629 wizyt

93,720 zapytań

142,648 odpowiedzi

323,266 komentarzy

63,270 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...