PDA

Visualizza la versione completa : [ANSI C] creazione dinamica di una stringa


andr3a
21-12-2004, 15:30
salve :fagiano:

io ho uno stupidissimo programma in C che mi sta facendo uscire pazzo :nonlodire

Dovrebbe chiedere quanti simboli voglio, assegnarli ad una stringa e stamparli, la cosa piu' stupida del mondo che mi da un risultato bastardo !!!



#include <stdio.h>
void firstLineCreator( char symbol, int manysymbol );
int main(void) {
char symbol = '*';
int manysymbol;
printf("How many symbols do you want ?\n");
scanf("%d", &manysymbol);
firstLineCreator( symbol, manysymbol );
return (0);
}
void firstLineCreator( char symbol, int manysymbol ) {
char symbolline[manysymbol];
int i;
for( i = 0; i < manysymbol; i++ ) {
symbolline[i] = symbol;
}
printf("%s\n",symbolline);
}


risultato:


How many symbols do you want ?
10
**********‼

ora ditemi cosa cavolo vogliono da me quei 2 !! quando nessuno gli ha detto di metterceli :nonlodire


grazie :ciauz:

andr3a
21-12-2004, 15:32
ma la cosa ancora piu' bastarda e' che se io scrivo
1
oppure 2
oppure 3
oppure 7
oppure 11

il programmino farda funziona alla perfezione :dh: :dh: :dh:

Compilatore gcc su Dev-C++ per windows versione 4.9.9.0

Ilmalcom
21-12-2004, 15:59
Non puoi mica fare una cosa del genere :fagiano: Per creare stringhe dinamicamente devi utilizzare la funzione malloc. Inoltre non metti il carattere di terminazione di stringa che piuttosto importante... Rispettando le tue specifiche, eccoti una funzione corretta



void firstLineCreator (char symbol, int manysymbol ) {
char *symbolline;
symbolline = malloc (manysymbol * sizeof (char));
int i;
for( i = 0; i < manysymbol; i++ ) {
symbolline[i] = symbol;
}
symbolline[++i] = '\0';
printf("%s\n",symbolline);
}

andr3a
21-12-2004, 16:04
intanto grazie :) ... poi ...


Originariamente inviato da Ilmalcom
Non puoi mica fare una cosa del genere :fagiano: Per creare stringhe dinamicamente devi utilizzare la funzione malloc.

perche' ?? ... cioe', se scrivo char string[10]; e li assegno uno ad uno va bene, se creo il contenuto in modo dinamico no ?
se facessi un char string[100]; senza malloc non potrebbe essere concettualmente identica la cosa ?

per non parlare che e' si vero che non avevo messo fagianamente il carattere di escape, ma e' anche vero che con la tua funzione fai un malloc su 10 e non su 11 ( 10 + quello di escape )


... queste cose proprio non le capisco :fagiano: .. a me sembra concettualmente identica come funzione :cry:



aggiungo che comunque non funziona :fagiano:


void firstLineCreator( char symbol, int manysymbol ) {
char *symbolline;
symbolline = malloc (manysymbol * sizeof(symbol));
int i;
for( i = 0; i < manysymbol; i++ ) {
symbolline[i] = symbol;
}
symbolline[(++i)] = '\0';
printf("%s\n",symbolline);
}

[Warning] assignment makes pointer from integer without a cast

anx721
21-12-2004, 17:02
Dipende da cosa vuoi creare te...in C non esiste il tipo stringa..per convenzione si considera una stringa un array di caratteri (allocato dinamicamente o staticamente), che contenga il carattere nullo '\0'.

Nelle estensioni del gcc possibile dichiarare una variabile array specificando al dimensione a runtime, come hai fatto tu nel tuo codice iniziale; se vuoi che tale array sia una stringa nel senso della convenzione sopra detta devi metterci il carattere di fine stringa '\0', quindi l'array deve essere dichiarato con una dimensione pari al numero di caratteri della stringa + 1, errorre che ha fatto anche Ilmalcom che ha scritto:

symbolline = malloc (manysymbol * sizeof(symbol));

che sbagliato perche non tiene conto del carattere di fine linea che quindi sar scritto fuori dall'array, mentre bisogna fare:

symbolline = malloc ((manysymbol + 1) * sizeof(symbol));

dove il ' + 1' sta proprio per il carattere di fine stringa.

In generale per creare stringhe dinamicamente devi usare la malloc, perch le variabili dichiarate staticamente, come gli array, hanno una durata limitata al blocco in cui avviene la dichiarazione.

Comuqnue l'unico errore che avevi fato nel tuo codice iniziale era appunto la mancanza del carattere di fine stringa, per cui la funzione printf non sa dove finisce la stringa e va avanti a stampare caratteri finche non incontra tale carattere in memoria o finche non interviene un errore di memoria, ciao

andr3a
21-12-2004, 17:06
Originariamente inviato da anx721
...
infatti, quello ce dicevo io, il malloc lo devi fare su 10 + 1 .... per il resto tutto ok, ho capito e lo so, pero' perche' continua a non funzionare ? :zizi:

la malloc e' in una libreria diversa da stdio.h ?

anx721
21-12-2004, 17:10
la malloc non una libreira ma una funzione di libreria, precisamente della libreria stdlib.h; quello che hai avuto come risultato dal compilatore non un errore, ma un warning che mi pare derivi dal fatto che non hai fatto il casting a (char *) sul risultato della malloc:

symbolline = (char *)malloc (manysymbol * sizeof(symbol));

se no indicami di preciso la riga a cui si riferisce il warning.

andr3a
21-12-2004, 17:26
ma io la stdlib.h non la includevo :fagiano:

cmq domani faccio prove e ti faccio sapere, grazie :ciauz:

Ilmalcom
21-12-2004, 19:33
Originariamente inviato da andr3a
infatti, quello ce dicevo io, il malloc lo devi fare su 10 + 1 .... per il resto tutto ok, ho capito e lo so, pero' perche' continua a non funzionare ? :zizi:

la malloc e' in una libreria diversa da stdio.h ?
La malloc in stdlib. Scusa per il +1 che mi sono dimenticato, qui sulla versione che ho compilato io c'era :fagiano: E posso garantirti che, copia/incollando quella che ho scritto io, la funzione fa il suo compito, senza alcun problema in fase di compilazione con gcc.
p.s. Il casting esplicito sulla malloc deprecato

anx721
21-12-2004, 19:35
Originariamente inviato da Ilmalcom
p.s. Il casting esplicito sulla malloc deprecato

fatto sta che in c++ non si puo compilare senza eseguire il cast esplicito sui risultati della malloc.

Loading