[C++]Tablica dynamiczna, nie mogę nic przypisać

Piszę sobie parser danych JSON.

#include 

#include 

using namespace std;

int main(){

	string a = "{\"menu\": \"file\", \"value\", \"wartość\"}";

	cout << "Przykładowe dane JSON:\n" << a << endl;

	int b = a.length();

	cout << "Długość stringa z JSON:\n" << b << endl;

	char *tab = new char[b*sizeof(char)];

	for (int i=0; i<=b; i++)

	{

		tab[i] = 1; // na razie przypisuje cokolwiek, bo i tak sie nic nie przypisuje

	}

	cout << "Terazy wyświetlamy tablicę znaków zawierającą dane JSON: \n";

	for (int i=0; i<=b; i++)

	{

		cout << tab[i] << endl; // wyswietal NIC...

	}

	delete [] tab;

}

Problem: w komentarzach

Tablica/string indeksowany jest od zera, jeśli zawiera N elementów/znaków to jest indeksowany od 0 … N-1

Tak więc nieostra nierówność

#include 

#include 

using namespace std;

int main(){

   string a = "{\"menu\": \"file\", \"value\", \"wartosc\"}";

   cout << "Przykładowe dane JSON:\n" << a << endl;

   int b = a.length();

   cout << "Dlugosc stringa z JSON:" << b << endl;

   char *tab = new char[b*sizeof(char)];

   for (int i=0; i
   {

      tab[i] = a[i];

   }

   cout << "Terazy wyswietlamy tablice znakow zawierajaca dane JSON: \n";

   for (int i=0; i
   {

      cout << i << " - " << tab[i] << endl; // wyswietal NIC...

   }

   delete [] tab;

}


[/code]

Usunąłem polskie znaki ze stringu a, std::string do obsługi znaków spoza ASCII się raczej nie nadaje,

1 to SOH(ASCII), więc nie dziw się, że strumień wyświetla Ci nie cyfrę 1 a znak jej odpowiadający(bo typ to char) :wink:

char *tab = new char[b*sizeof(char)];

to mnożenie jest niepotrzebne(tylko zaciemnia kod), sizeof(char) _ZAWSZE_ zwraca 1 :wink:

No racja, int się czasem zmienia i tak myślałem i tu (;

@reszta - działa już.

Jeszcze tylko zapytam:

czemu tak nie działa:

*(tab+i) = a_?_

Hmm SOA#1, tab oraz *(tab+i) są zasadniczo równoważne.

Jak się objawia u Ciebie to niedziałanie?

Przypisuje null…

pokazywanie: *(tab+i) działa

GCC 4.4.1

int dl=a.length();

char *tab = new char[dl+1];

memcpy(tab,a.c_str(),dl+1);

Fajna funkcja, dziękuję.

Możesz tylko powiedzieć czemu musi być o 1 bajt więcej dla tej tablicy?

I którą bibliotekę muszę dołączyć.

Bo cstdio nie ma

dla memcpy:

#include

generalnie wchodzisz na stronę http://www.cplusplus.com/ w szukaj wpisujesz memcpy i patrzysz co potrzebne.

O jeden więcej ponieważ, ciąg znaków “ala” zajmuje 4 bajty = 3 bajty (na samo słowo) + 1 bajt (na znak końca napisu).

memcpy jest w nagłówku string.h(C++: cstring).

std::string::length() zwraca długość ciągu bez znaku 0, a c-stringi(głównie je się używa w C/C++) muszą być null terminated dlatego jest to +1(std::string wewnątrz przechowuje normalny c-string, ale nie wiem czy to jest dyktowane standardem).

Dzięki.

Wiedziałem że stringi przechowują null’a na końcu (aczkolwiek nie zawsze)

Ale nie wiedziałem że std::string::length() zwraca długość bez tego nulla.

Teoretycznie nie ale praktycznie tak, gdyby nie było przechowywane c-string to jakbyś zrealizowałeś metodę c_str()? Albo dynamicznie przydzielać nową pamięć = brak kontroli nad zwolnieniami tej pamięci, albo trzymać c-string.

Po pierwsze nie null’a tylko ‘\0’ lub 0. std::string::length() czy strlen() zawsze zwracają długość tekstu a nie rozmiar bufora.