tablica dynamiczna char

tablica dynamiczna char
0

witam otóż mam problem z programem.
polecenie jest takie:
Napisz funkcję, która pozwoli wczytać do dynamicznej tablicy znaków
tekst składający się z dowolnej (nieznanej na początku) ilości liter.
Tzn. w czasie wczytywania, w miarę wprowadzania kolejnych liter,
rozmiar wykorzystywanej tablicy powinien być dynamicznie powiększany.
Moja proba pod linkiem
http://4programmers.net/Pastebin/4658

Program po wpisaniu około 20 liter przestaje dzialac ponadto wyswietla jakies szlaczki zamiast liter a nigdzie nie doszukałem się bledu.
Dziekuje i Pozdrawiam :)

grzesiek51114
grzesiek51114
  • Rejestracja:ponad 11 lat
  • Ostatnio:ponad 4 lata
  • Postów:2442
1

Na pewno chodzi o C++, bo to mi wygląda na ćwiczenie z C i funkcją realloc?
http://www.cplusplus.com/reference/cstdlib/realloc/

edytowany 1x, ostatnio: grzesiek51114
kq
To się w sumie wzajemnie nie wyklucza, mimo że jest mało sensowne.
kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:około 11 godzin
  • Lokalizacja:Szczecin
6
Kopiuj
	char * tablica=new(nothrow)char[rozmiar+1];
	for(int i=0;i<rozmiar;i++)
	{
		tablica[i]=tab[i];
	}
	tablica[rozmiar+1]=x;

Użyj std::copy, albo std::memcpy zamiast bawić się w pętle.

tablica[rozmiar+1] to UB, zapisujesz do elementu za ostatnim.

Kopiuj
while(znak!=27)

Magic numbers = zło. Ponadto C/C++ nie gwarantują użycia ASCII.

Swoją drogą, mogłeś użyć po prostu std::string lub std::vector<char>, by się obyło bez problemów z realokacją czy kopiowaniem.

Kopiuj
char * tablica=new(nothrow)char[rozmiar+1];

Jeśli już używasz nothrow to wypadałoby sprawdzić, czy tablica jest różne od nullptr


edytowany 2x, ostatnio: kq
grzesiek51114
grzesiek51114
  • Rejestracja:ponad 11 lat
  • Ostatnio:ponad 4 lata
  • Postów:2442
0

W czystym C zrobiłbym to tak:

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

char* createString(){
    char character = ' ';
    char* start = NULL;
    char* array = NULL;
    int count = 0;

    printf("Press ENTER after each character.\nChar '.' ends the loop.\nProceed:\n");
    do{
        scanf("%c", &character);
        array = (char*)realloc(start, (count + 1) * sizeof(char));
        if(array != NULL){
            start = array;
            start[count] = character;
        }
        else {
            free(start);
            exit(1);
        }
        count++;
        fflush(stdin);
    }while(character != '.');
    array[count - 1] = '\0';
    return array;
}

int main(void)
{
    char* string = createString();
    printf("%s\n",string);
    free(string);
    return 0;
}

Chociaż nie wiem czy dobrze zrozumiałem zadanie. Nie mam valgrind'a pod ręką ale chyba wycieków nie ma.

edytowany 4x, ostatnio: grzesiek51114
_13th_Dragon
Może warto buforowanie co 8 znaków dodać, w sensie przedzielamy zawsze podzielną przez 8 liczbę bajtów.
grzesiek51114
grzesiek51114
@_13th_Dragon w sensie żeby za jednym zamachem od razu więcej pamięci dać? No można w sumie ale to już sobie kolega autor wątku poprawi jak będzie chciał`.
kaczus
fflush(stdin); może się nie udać i to jest błąd. Inna rzecz, że raczej bobierałbym partiami, no i scanf zaprzegnięty TYLKO do wczytania znaku? - bez sensu.... A i 'exit` jesli funkcja nie dziala, to nieladnie, jesli chodzi o programowanie, bo to nie musi być kluczowa funkcja programu, ogolnie exit powinno się używać bardzo rzadko.
_13th_Dragon
@grzesiek51114 optymizm to właściwie dobra cecha, ale ...
grzesiek51114
grzesiek51114
@kaczus fakt return NULL; można chociażby zrobić.
_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:3 miesiące
0
Kopiuj
#include <stdio.h>
#include <stdlib.h>

char *getline(int term)
  {
   char *str;
   int ch;
   size_t size=0,capacity=8;
   for(str=malloc(capacity);;str[size++]=ch)
     {
      if(size>=capacity) str=realloc(str,capacity+=8);
      if(((ch=getchar())==term)||(ch==EOF)) break;
     }
   str[size]=0;
   return str;
  }
  
int main()
  {
   char *str=getline('\n');
   printf("\"%s\"\n",str);
   free(str);
   return 0;
  }

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
0

no raczej musiałbym to zrobić na getch() i new delete bo na tym się aktualnie skupiamy na zajęciach, no i w poleceniu jest ze co 1 literke ma się buforować. Nie jest bledem to ze litera jest generalnie stala?
Dzieki wszystkim za pomoc :)

0

no i oczywiście tylko na standardowych bibliotekach bez mem etc
Na razie uczymy się tworzyć takie funkcje od podstaw a nie korzystać zgotowych ;)

kq
Wszystkie podane funkcje znajdują się w bibliotece standardowej.
0

no tak miałem na myśli podstawowe. Generalnie wszystko mamy robic na piechotę i albo na malloc albo na new etc jednak ja wybrałem to 2 i nwm gdzie mam blad.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.