2010-04-08 9 views
13

W zadaniu na studia zasugerowano użycie funkcji C readline w ćwiczeniu. Szukałem jej referencji, ale wciąż jej nie znalazłem. Czy to naprawdę istnieje? W którym nagłówku? Czy możesz przesłać link do referencji?C funkcja readline

Odpowiedz

15

Readline istnieje w dwóch miejscach: libreadline i libedit (zwany także libeditline). Oba mają identyczny interfejs. Różnica polega na tym, że libreadline jest licencjonowany na licencji GPL, libedit to 3 klauzula BSD. Licencjonowanie naprawdę nie stanowi problemu dla zadania, przynajmniej nie sądzę, że tak jest. Każda licencja pozwala na swobodne korzystanie z kodu. Jeśli łączysz się z readline, upewnij się, że cały program GPL 2 or later, który zaspokoi dowolną wersję GPL reguluje system readline. Może to być GPL2 + lub GPL3 +, w zależności od wieku systemu. Nie jestem zwolennikiem żadnej z licencji, to zależy od ciebie.

Uwaga, dbać, aby zainstalować albo/albo i dostosować powiązanie ile potrzeba (-lreadlinelub-leditlub-leditline). Oba są bibliotekami, a nie częścią standardowej biblioteki C.

Edit (refleksja):

Jeśli wydać program na dziko, jest to miły gest, aby umożliwić użytkownikowi skonfigurować go z ich readline wyboru. Na przykład: --with-readline lub --with-libedit itd. Pozwala to na pakiet binarny, który jest zgodny z ich wyborem licencji, przynajmniej jeśli chodzi o readline.

Linki: Readline i Edit/Editline.

+3

co oznacza, że ​​chcesz 'libedit' powodować reguły BSD. : P – Earlz

+0

Tak, widziałem 'libedit' wcielony jako' libeditline' na więcej niż kilku systemach, chociaż nie pamiętam, co oni w tej chwili byli. –

+0

Należy również pamiętać, że nie zawierałem żadnej z tych licencji. readline może być GPL2-lub-nowszy lub GPL3 w zależności od używanej wersji, jednak licencja BSD na 3 klauzule pozostaje statyczna. –

-5

Nie istnieje.

Pomylili się i zostali odesłani do gets() from stdio.h.

Jest to także bardzo niebezpieczna funkcja ze względu na brak maksymalnego rozmiaru parametru do odczytu, co powoduje, że jest ona natychmiast bezpieczna w całości (atak przekroczenia bufora wyszukiwania). Zamiast tego możesz użyć fgets(), jak sugerują poniższe złe komentarze.

+11

Nie, ** nie używaj 'dostaje' - nigdy! –

+0

@Jerry +1 ... czy polecasz używanie fgetów? – LB40

+3

Aby cofnąć Jerry'ego w górę: 'gets' nie pozwala określić limitu liczby znaków do odczytania. Jest to złe, ponieważ czytasz tablicę znaków o stałej długości. Jeśli czytasz tekst dłuższy niż długość tablicy, otrzymujesz przepełnienie bufora, co może spowodować awarię programu lub zastąpienie pamięci, która nie powinna zostać dotknięta. –

3

Nie sądzę, że jest to standardowa funkcja.

ja prosta implementacja byłaby tak:

char *Readline(char *in) { 
    char *cptr; 

    if (cptr = fgets(in, MAX_LINE, stdin)) { 
    /* kill preceding whitespace but leave \n so we're guaranteed to have something 
    while(*cptr == ' ' || *cptr == '\t') { 
     cptr++; 
    } 
    return cptr;  
    } else { 
    return 0; 
    } 
}

Wykorzystuje fgets(), aby odczytać maksymalnie MAX_LINE - 1 znaków do bufora 'w'. Usuwa on poprzedzające białe znaki i zwraca wskaźnik do pierwszego znaku, który nie jest spacja.

+5

readline() oferuje historię poleceń, uzupełnianie kart, prostą edycję linii, itp. Jest to zewnętrzna, ale szalenie popularna biblioteka. –

+1

@Tim: Masz rację, biblioteka Readline to robi, ale myślę, że chce tylko funkcji odczytu linii jako tablicy znaków C. – yassin

+3

Myślę, że chciał linków do bibliotek. –