Tablice i wskaźniki język c

0

Witam
mam pytanie odnośnie tablic i wskaźników w języku C. W książce "Język ANSI C" przedstawiono przykład funkcji getline(), która wczytuje kolejne wiersze z wejścia i umieszcza je w tablicy. Cała funkcja została utworzona z wykorzystaniem operacji na tablicach. Jej treśc wyglada następująco (przepisuję z pamięci więc są inne nazwy zmiennych ale generalnie idea jest taka by dane wprowadzac do tablicy):

int getline(int Tablica, int MAXLINE)
{
   int i;
   for(i=0;i<MAXLINE-1&&(c=getchar())!='\n';i++)
    Tablica[i]=c;
   if(c=='\n')
   {
      Tablica[i]=c;
      i++;
    }
   Tablica[i]='\0';
   return i;

Chciałem napisac sobie taką funkcję z wykorzystaniem wskaźników i stworzyłem taki kod

 
#include <stdio.h>


#define MAXLINE 10

int getline(char* tekst);

int main()
{
        char *TablicaWskaznikowDoTekstow[10]; //Tablica 10 wskaźników do napisów które chcę wprowadzic z klawiatury za pomocą funkcji getline
        int i;
        for(i=0;i<10;i++)
        {
                getline(TablicaWskaznikowDoTekstow[i]);
        }

        for(i=0;i<10;i++)
        {
                printf("%s\n",TablicaWskaznikowDoTekstow[i]);

        }
        getch();
        return 0;
}

int getline(char* tekst)
{
        int i;
        int c;
        for(i=0;(c=getchar()!='\n')&&(i<MAXLINE-1);i++)
        {
                *tekst=c;
                tekst++;
        }
        if(c=='\n')
        {
                *tekst=c;
                tekst++;
                i++;
        }
        *tekst='\0';
        return i;
}

Czy mógłbym prosic o wskazanie gdzie jest błąd i wyjaśnienie tego błędu.

2

char *TablicaWskaznikowDoTekstow[10]; to 10-elementowa tablica wskaźników na znak.
Tablica nie ma ustalonej wartości!
Popraw to tak:

char tablicaTekstow[10][0x100];

Zamiast używać getline użyj fgets.

0

Napisałeś, że

 char *TablicaWskaznikowDoTesktow
  • to 10-elementowa tablica wskaźników na znak. Czy to znaczy, że w tej tablicy można zmieścic tylko 10 pojedynczych znaków typu char. Piszesz też, że tablica nie ma ustalonej wartości. Czy to znaczy, że tablica powinna byc przy deklaracji zainicjalizowana np. wartością NULL.
    Nie chciałbym korzystac z funkcji fgets, bo chcę sobie przecwiczyc operacje na wskaznikach do char. Dlatego tworzę sobie własną funkcję. Nie do końca rozumiem wskaźniki a są przecież intensywnie wykorzystywane w języku C. W książce "Język ANSI C" też wskaźniki do typu char nie są tak do końca jasno wytłumaczone. Czy mógłbyś mi jakoś prosto wytłumaczyc, albo przedstawic jak ten program który sobie tworzę powinien wyglądac. Moja idea jest taka, że tworzę 10 elementową tablicę wskaźników do zmiennych typu char. W tej 10 elementowej tablicy zapisuję teksty o różnej długości do napotkania znaku nowego wiersza.
    Po poprawieniu deklaracji tablicy zgodnie z Twoim zaleceniem program się kompiluje, ale wyswietlane są błędne wyniki, czyli pewnie gdzies przy wczytywaniu danych musi byc błąd.
3

Twoja koncepcja jest ok, ale implementacja to dramat i niewiele ma wspólnego z tą koncepcją.

Wskaźnik to jest coś co pokazuje jakieś miejsce w pamięci, adres. Wskaźnik mozesz sobie wyobrazić jako karteczkę z zapisanym adresem twojego kolegi, rodziców, cioci. Tworząc sobie sam wskaźnik dostajesz karteczkę z losowym adresem na niej. Przupisując tam NULLa wymazujesz adres na karteczce. Ty masz tam 10 karteczek z losowymi adresami. Ale nie kupiłeś żadnego domu! I próbujesz teraz rozdać komuś te karteczki i sugerujesz zeby się wprowadzali... To tak nie działa. Pamięć musisz tak czy siak zaalokować przez malloc() jeśli cokolwiek chcesz tam wpisać. Co więcej musisz od razu wiedzieć ile tej pamięci ci potrzeba! Jak kupisz składzik na miotły (zaalokujesz mało pamięci) i spróbujesz tam wprowadzić 100 osób (długi napis) to też nie zadziała bo ci sie te osoby wysypią ze składziku.

0

Witam a czy teraz jest poprawnie?

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


#define MAXLINE 10
#define MAXTAB 3

int getline(char* tekst);

int main()
{
        char *TablicaWskaznikowDoTekstow[MAXTAB];
        int i;
        for(i=0;i<MAXTAB;i++)
        {
                TablicaWskaznikowDoTekstow[i]=(char*)malloc(MAXLINE);
               getline(TablicaWskaznikowDoTekstow[i]);
        }

        for(i=0;i<MAXTAB;i++)
        {
                printf("%s",TablicaWskaznikowDoTekstow[i]);

        }
        for(i=0;i<MAXTAB;i++)
                free(TablicaWskaznikowDoTekstow[i]);

        return 0;
}

int getline(char* tekst)
{
        int i;
        int c;
        for(i=0;((c=getchar())!='\n')&&(i<MAXLINE-1);i++)
        {
                *tekst=c;
                tekst++;
        }
        if(c=='\n')
        {
                *tekst=c;
                tekst++;
                i++;
        }
        *tekst='\0';
        return i;
}

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