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 :)

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/

6
	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.

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.

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

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

0

W czystym C zrobiłbym to tak:

#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.

0
#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;
  }
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 ;)

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.

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