Deklaracja tablicy char bez podawania jej rozmiaru

0

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;

0
char *napis=strdup(CiagZnakowKtoryChceszNastepniePrzepisac);
0

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?

0

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;

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