Chcę zadeklorować tablicę char bez podawania jej rozmiaru. Następnie przypisać jej ciąg znaków. Wiem, że muszę najpierw przypisać pamięć zmiennej wskaźnikowej więc oprócz deklaracji zmiennej nie wiem co dalej;
char *napis;
Chcę zadeklorować tablicę char bez podawania jej rozmiaru. Następnie przypisać jej ciąg znaków. Wiem, że muszę najpierw przypisać pamięć zmiennej wskaźnikowej więc oprócz deklaracji zmiennej nie wiem co dalej;
char *napis;
char *napis=strdup(CiagZnakowKtoryChceszNastepniePrzepisac);
nie rozumiem tego strdup
poradziłem sobie z problemem, ale chce wiedzieć czy nie można tego zrobić krócej. W c++ wystarczyła by zmienna string, ale muszę robić w C.
#include <stdio.h>
#include <stdlib.h>
int main()
{
char *napis;
int rozmiar;
char znak;
rozmiar = 1;
napis = (char*) malloc(rozmiar*sizeof*napis);
while(znak=getchar())
{
if (znak!='\n')
{
napis[rozmiar-1]=znak;
rozmiar++;
napis = realloc (napis,rozmiar*sizeof*napis);
}
else
break;
}
printf("\n\n%s",napis);
return 0;
}
Na początku przypisuję pamięć równą 1 znakowi.
Potem w pętli przypisuje pobierany znak do zmiennej pomocniczej, jeśli nie jest znakiem końca lini to przypisuje go do tablicy i zwiekszam jej rozmiar. Da się to zrobić prościej?
Jeżeli chcesz wczytać napis od użytkownika to radzę ograniczyć jakimś konkretnym rozmiarem:
char buf[1024];
fgets(buf,1024,stdin);
char *napis=strdup(buf);
Jeżeli chodzi o rozmiar to jedynie drobne optymalizacje da się zrobić:
int znak; // koniecznie int dla porównania z EOF
size_t rozmiar=0;
char *napis;
for(napis=NULL;((znak=getchar())!='\n')&&(znak!=EOF);napis[rozmiar++]=znak) napis=(char*)realloc(napis,rozmiar+1);
napis=(char*)realloc(napis,rozmiar+1);
napis[rozmiar]=0;
Jeżeli chodzi o wydajność to warto zrobić listę fragmentów i na końcu ich posklejać lub przynajmniej trzymać rozmiar i pojemność:
int znak; // koniecznie int dla porównania z EOF
size_t rozmiar=0,pojemnosc=16;
char *napis;
napis=(char*)malloc(pojemnosc);
while(((znak=getchar())!='\n')&&(znak!=EOF))
{
napis[rozmiar]=znak;
if(++rozmiar>=pojemnosc) napis=(char*)realloc(napis,pojemnosc+=16);
}
napis[rozmiar]=0;