Newsgroup: it.comp.lang.c
Titolo: Array di stringhe

Aiutate un povero informatico che ha l'esame di laboratorio lunedi' :))
salve ...
ho un problema: come costruire u array di stringhe ..
pensavo a qualcosa tipo:
void CreaElenco(int nvoci)
{  char *elenco;
   char buf[10];
   int cont;
 
	elenco=malloc(sizeof(char *) * nvoci);
	for(cont=0;cont<nvoci;cont++){
		sprintf(buf,"voce numero %d",cont);
		elenco[cont]=strdup(buf);
	}
}
naturalmente questo esempio non serve a molto ... ma esprime
perfettamente il mio problema:
devo allocare dinamicamente un array di caratteri!!
QUAL E' LA FORMA CORRETTA???
Francesco Scotti

 }
Ricordati la definizione di "argv":
char **argv;
*argv = (char *) malloc (sizeof(char*) * N); /* Se non sbaglio nell'ANSI C
malloc e`
(void*)malloc(), quindi il cast e` necessario
Non ricordo se la strcpy allocca anche la memoria (mi pare di si`)
strcpy(argv[i],"Stringa da inserire");
Per ogni elemento dell'array.
Spero di essere stato chiaro.
    Saluti
  Andrea Perazzolo
 
han...@bandit.sci.univr.it

A me sembra corretta (se non ricordo male cosa fa strdup). Oppure puoi fare
cosi':
La prima allocazione che fai alloca un vettore di puntatori.
Prima di copiare la stringa nell'elemento del vettore devi fare una seconda
allocazione della lunghezza della stringa che ti server.
elenco[buf] = malloc(sizeof(char) * strlen(buf));
strcpy(elenco[cont], buf);
Ciao.
--
Antonio Donatiello
SANPAOLO Spa

Se devi fare un'allocazione VERAMENTE dinamica, devi usare le liste .
Ciao
                Hal 9000 MagicSoft
 
fen...@mail.asianet.it

QUAL E' LA FORMA CORRETTA???
Forse quello di cui hai bisogno e' un array di stringhe ! :)
elenco va definito come
char **elenco;
ed inizializzato come
elenco = (char**)malloc(sizeof(char*)*nvoci);
elenco[i] va inizializzato come
elenco[i] = (char*)malloc(sizeof(char)*11));
*elenco[0]....*elenco[n] saranno le stringhe.
Andrea
------------------------------------------------
combatti anche tu il "nano scemo" :
http://www.geocities.com/Hollywood/Studio/6989
------------------------------------------------

Se devi fare un'allocazione VERAMENTE dinamica, devi usare le liste .
E' vero, sono d'accordo.
In effetti usare un array di stringhe significa usare una struttura
dati comunque lineare, di cui bisogna sapere la grandezza a priori,
perche' i puntatori siano contigui in memoria.
Mentre usare una lista, consente di non preoccuparsi del numero di
stringhe, a priori, coinvolge soltanto un puntatore al prossimo
elemento ed offre, in questo modo, la vera allocazione dinamica.


Ciao a tutti!
Non so dove trovare delle librerie che mi permettano di gestire
i numeri con precisione arbitraria ad es. 100, 200 o anche
1000 cifre decimali. In Fortran esistono ma in C?
...Ahem, non è questo il newsgroup giusto ma...
e in Basic quelle stesse librerie esistono?
Grazie per l'aiuto.
Manfredi
mrug...@tin.it

Non ricordo se la strcpy allocca anche la memoria (mi pare di si`)
No,  copia soltanto.


Esatto.
Esatto?!? Non direi... :
00:22:25@~/bin/prova #cat prova.c
#include <stdlib.h>
int main()
 {
  char **p;
  p=malloc(1000);
  free (p);
  return 0;
 }
00:22:55@~/bin/prova #gcc -o prova -Wall -ansi -pedantic prova.c
00:22:58@~/bin/prova #dir
total 7
drwxr-xr-x   2 root     root         1024 Feb  6 00:22 ./
drwxr-xr-x   3 root     root         1024 Jan 30 20:16 ../
-rwxr-xr-x   1 root     root         3953 Feb  6 00:22 prova*
-rw-r--r--   1 root     root           92 Feb  6 00:22 prova.c
Tu vedi per caso qualche errore o qualche warnings?!?
Il cast da void * a qualunque tipo di puntatore valido e' lecito e
stabilito dallo standard. Il cast non e' necessario.
Ciao, a presto.

  p=malloc(1000);
Be' tu non ci crederai, ma  il mio compilatore mi riporta un fatal
error del tipo 
"cannot convert (void*) to (char**)" 
E trattasi del Borland C++ che e' del 1990 e quindi costruito
sull'ANSI-C '89.
--------------------------------------------------------
Andrea      
mica uno qualunque...
--------------------------------------------------------

sull'ANSI-C '89.
Boh, su quello non mi posso pronunciare, perche' non lo conosco. Comunque
il Borland C++ 3.0 (del 92) compila l'esempio da me riportato senza fiatare.
Sicuro che la IDE (ammesso che al stia usando) non sia di default
predisposta  per il C++??? Te lo dico perche', proprio con lo stesso
esempio, ci rimasi fregato qualche anno fa...
Prova (per curiosita', e se ti interessa...) a scrivere le poche righe
di codice in un file e lancia il compilatore da linea di comando ( es.
tcc prova.c ) e vedi cosa succede.
Ciao, a presto.


esempio, ci rimasi fregato qualche anno fa...
Hai ragione ! era predisposto per il C++...in effetti se lo salvo come
.C non fiata neanche lui :-)
Pero' ti diro' di piu' : l'ho anche compilato col gcc e a quanto pare
non dice niente neanche lui...
In realta' in questi giorni sto scoprendo che il gcc in relazione al
borlandc funziona molto meglio. Mah !....
