Wczytywanie tekstu o dowolnej długości

0

Próbuje przestawić się z Delphi na C i brakuje mi dość mocno takiej "bezstresowej" obsługi stringów jaką ma Object Pascal :) . Czy jest w C jakaś funkcja która potrafi wczytać z wejścia dowolną ilość znaków alokując przy okazji dla nich pamięć ? W BCB wykombinowałem takiego dziwoląga:

char* str_scanf(){
  int n = 0;
  char c = 0;
  char *str = (char *) malloc(sizeof(char));

  while (c != 13){
    str = (char *) realloc(str, n + 1);
    c = getch();
    printf("%c", c);
    str[n++] = c;
  }
  str[n] = 0;
  printf("\n");
  return str;
}

Problem polega na tym, że musze działać na gcc w linuxie gdzie getch() nie ma. Może da się to zrobić inaczej ?

0

Jeśli użyjesz C++ to masz do dyspozycji funkcje getline(istream, string)

0

no to pod *niksami masz juz gotowa funkcje : man 3 getline :)

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int readline(char** ret){ // funkcja zwraca dlugosc ciagu bez znaku 0 - to samo co zwroci strlen lub -1 gdy zawiedzie getline
  ssize_t read;
  char* line=0; // NULL
  size_t len=0;
  if((read=getline(&line,&len,stdin))!=-1){
    // printf("%d %d %d %s",read,len,strlen(line),line); // debug code, odkomentuj i popatrz
    if(line[read-1]=='\n')line[--read]=0;   // zmieniamy znak konca linii na 0, skracamy ciag
    *ret=strdup(line);  // w ten sposob na wyjsciu masz ciag ktory zajmuje dokladnie tyle ile potrzebuje a nie tyle ile zostalo mu przydzielone
    if(!*ret){
      *ret=line; // a to na wszelki wypadek, gdyby strdup nie moglo przydzielic pamieci, wtedy masz tyle pamieci ile getline uwazalo za stosowne pobrac (zmienna len)
      return read; // i omijamy wtedy zwalnianie
    }
  }
  free(line);
  return read;
}

main(){
  char* s;
  int i;
  while((i=readline(&s))>0){
    printf("%d %s\n",i,s);
    free(s);
  }
  return 0;
}
0

Z waszym wypowiedzi wynika że getline mozna uzywać prz c++ - niestety ja jestem ograniczony do GCC więc getline odpada :/ .

0

[glowa] a niby jak to kompilowalem ?

http://flabra.carramba.homelinux.org/temp/readline.png

0
flabra napisał(a)

[glowa] a niby jak to kompilowalem ?

http://flabra.carramba.homelinux.org/temp/readline.png

Ja niestety znam się na linuxie równie słabo jak na c, więc czy móglbyś mi wyjaśnić czemu mnie ta kompilacja wygląda tak http://www.delphi.is.net.pl/readline.png ?

0

odpal ldconfig. poza tym : 'Both getline() and getdelim() are GNU extensions. They are available since libc 4.6.27.' - masz ?. to nie jest wina kompilatora, ani braku nagłówków, tylko konfiguracji systemu, bibliotek i ld.

0

Zapewne nie mam skoro nie działa... używam linuksowego konta na agh i żadnych szczegółów konfiguracji nie znam :/.

0

Pewnie piszesz gcc zamiast g++ :)
Jak chcesz skompilować c++ to używaj kompilatora c++, a nie c :)

0
Dungeon_Master napisał(a)

Pewnie piszesz gcc zamiast g++ :)

Tak, Sherlocku !! :d A teraz przeczytaj dokładnie co napisałem na końcu swojego pierwszego posta :) .

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