Condividi:        

[C] Problema con vettori di dimensione sconosciuta

Problemi di HTML? Di PHP, ASP, .NET, JSP, Perl, SQL, JavaScript, Visual Basic..?
Vuoi realizzare programmi in C, C++, Java, Ruby o Smalltalk, e non sai da che parte cominciare?
Entra qui e troverai le risposte!

Moderatori: Anthony47, Triumph Of Steel, archimede

[C] Problema con vettori di dimensione sconosciuta

Postdi Ciao3 » 13/04/11 01:05

Ciao,
mi ritrovo con un problema in C di cui non conosco la soluzione. Supponiamo che un utente voglia eseguire un programma da riga di comando e che il programma voglia creare un vettore delle dimensioni ESATTE della sottostringa inserita dall'utente; ad esempio, supponendo di chiamare substring.exe l'eseguibile, digitando dalla riga di comando di Windows

substring albero

vorrei che il mio programma immagazzini "albero" in un vettore di esattamente 6+1[le 6 lettere di albero + il carattere '\0' di chiusura stringa] elementi ma se per esempio fosse

substring calendario

vorrei che fosse generato un vettore esattamente di 10+1 elementi. Il tutto per evitare di allocare memoria inutilmente dichiarando per esempio un vettore

char substring[SIZE];

di dimensione pari ad una costante SIZE scalabile. Mi sapreste dire come fare? da quanto ne so non posso infatti dichiarare un vettore come

char substring[];

Vi ringrazio e buonanotte
Ciao3
Utente Junior
 
Post: 40
Iscritto il: 31/07/09 15:05

Sponsor
 

Re: [C] Problema con vettori di dimensione sconosciuta

Postdi criva89 » 15/04/11 13:13

Ciao, Ciao3 :D

non me ne intendo molto, però potresti usare gli stream per manipolare
lo std input: con la fseek ti posizioni in fondo alla parola data in input,
con ftell puoi sapere il numero di caratteri tra l'inizio e la fine dell'input.
Quindi con malloc crei un vettore e allochi dinamicamente memoria per la dimensione
della parola inserita. Aspetta comunque il consiglio di uno esperto di me se vuoi essere sicuro.

Il codice per esempio potrebbe essere così

Codice: Seleziona tutto
#include <stdio.h>
#include <stdlib.h>

int main(){   
    char *parola = NULL;   
    int fLength = 0;   
    FILE *file = NULL;
       file = fopen("stdin","r");  //Apri uno stream e ci redirigi lo std input
    fseek(file, 0, SEEK_END);   //Ti posizioni alla fine dell'input
    fLength = ftell(file);       //Calcoli il numero di caratteri presenti
    if ((parola = (char*)malloc(fLength * sizeof(char) + 1)) == NULL){     
             //Allochi memoria dinamicamente
              fclose(file);
              printf("operazione fallita");
              }   
    fseek(file, SEEK_SET, 0);   //Ti riposizioni in cima all'input
    fread(parola, sizeof(char), fLength, file);  // inserisci il la parola nel vettore
    parola[fLength + 1] = '\0';   //inserisci il carattere di fine stringa
    free(parola);
    close(file);
    }


Sicuramente ci sarà qualche errore, ma il concetto di fondo è questo
Spero di esserti stato d'aiuto
Avatar utente
criva89
Utente Junior
 
Post: 14
Iscritto il: 14/01/10 02:12

Re: [C] Problema con vettori di dimensione sconosciuta

Postdi zello » 19/04/11 11:15

Scusa, ma ce l'hai già...

Il main del C è dichiarato come:
Codice: Seleziona tutto
int main (int argn, char** args)


argn è il numero degli argomenti a linea di comando, args è un puntatore a stringhe (puntatore a puntatore di caratteri, perché una stringa in C è semplicemente un array di caratteri terminato in zero).
args[0] è il nome del programma. Da args[1] in poi hai i vari argomenti passati sulla linea di comando. Puoi prenderne la lunghezza (strlen), duplicarli (strdup, oppure strlen/malloc/strcpy), farci un po' il tubo che ti pare.
Il faut être toujours ivre. Tout est là : c'est l'unique question. Pour ne pas sentir l'horrible fardeau du Temps qui brise vos épaules et vous penche vers la terre,il faut vous enivrer sans trêve...
Avatar utente
zello
Moderatore
 
Post: 2351
Iscritto il: 06/05/02 13:44


Torna a Programmazione


Topic correlati a "[C] Problema con vettori di dimensione sconosciuta":

problema blocco note
Autore: carlin
Forum: Software Windows
Risposte: 7

Chi c’è in linea

Visitano il forum: Nessuno e 10 ospiti