PROBLEMA [C]split stringhe

Pubblicità

ilfe98

Utente Èlite
Messaggi
3,083
Reazioni
1,317
Punteggio
134
salve a tutti ragazzi non ho idea di come fare risolvere questo problema sapreste aiutarmi?
ho pensato che potrei scorrere il vettore fin quando non trovo successive caratteri "/ " e salvarmi l'indice, ma non credo sia efficente potreste aiutarmi?
Creare i file path_split.h e path_split.c che consentano di utilizzare la seguente funzione:

extern void path_split(const char *str, char **path, char **filename);

La funzione prende come parametri una stringa C e due puntatori a puntatore a char. La funzione deve dividere la stringa (che sarà un percorso di file) in due parti in corrispondenza del carattere \ più a destra e modificare i puntatori puntati da path e filename in modo che puntino a due nuove stringhe allocate dinamicamente contenenti le due parti della stringa: la prima fino al carattere \ incluso e la seconda il resto.
Con il percorso c:\user\esami\FdI2017\esercizi si otterranno le stringhe c:\user\esami\FdI2017\ e esercizi.
Con il percorso c:\\user\\esami\\FdI2017\\esercizi\\file.txt si otterranno le stringhe c:\\user\\esami\\FdI2017\\esercizi\\ e file.txt
Con il percorso esercizi\\ si otterranno le stringhe esercizi\\ e la stringa vuota (colo terminatore).
Se la stringa è NULL la funzione imposta i puntatori puntati da path e filename a NULL.
C:
#include<string.h>
#include<stdio.h>
extern void path_split(const char *str, char **path, char **filename) {
    int pa = strlen(str);
    size_t i = pa + 1;
    printf("%i", pa);
    while (str[i] == '\\') {
        i=i- 1;
    }
    for (size_t z = 0; z < i; z++)
        path[z] = str[z];
    path = 0;
    size_t c = 0;
    for (; str[i] != 0; i++){
        filename[c] = str[i];
    c++;
}
    printf("%s", filename);
}
int main(void) {
    char *c[100];
    char *d[100];
    path_split("c:\user\esami\FdI2017\esercizi", &c, &d);
}
 
Scusami ma da quanto capito dagli esempi non puoi partire dalla fine della stringa e percorrerla al contrario, finché non trovi un \ e da lì fare due divisioni?
Come hai detto tu ma dalla fine della stringa
 
Scusami ma da quanto capito dagli esempi non puoi partire dalla fine della stringa e percorrerla al contrario, finché non trovi un \ e da lì fare due divisioni?
Come hai detto tu ma dalla fine della stringa
Fatto anche in quel modo il punto è gestire i doppi puntatori non è il problema in se, ma quanto l'utilizzo dei doppi puntatori
 
No, non lo hai risolto correttamente.
Dal testo dell'esercizio, è la funzione che deve allocare dinamicamente lo spazio per le due stringhe, e ritornare i rispettivi puntatori. Per cui il main deve essere

Codice:
char *file, *path;
path_split("c:\user\esami\FdI2017\esercizi", &path, &file);
Lascio a te correggere la funzione.
 
No, non lo hai risolto correttamente.
Dal testo dell'esercizio, è la funzione che deve allocare dinamicamente lo spazio per le due stringhe, e ritornare i rispettivi puntatori. Per cui il main deve essere

Codice:
char *file, *path;
path_split("c:\user\esami\FdI2017\esercizi", &path, &file);
Lascio a te correggere la funzione.
Grazie per la risposta,ho scritto quel main per testare la funzione tuttavia il problema è che il prof inserirà una stringa del tipo c:\aaa\bbb\ccc
sicuramente saprete meglio di me che lo standard del c richiede \\ per inserire un singolo \,il probklema è proprio quello io posso iterare al contrario allocare con la calloc ecc (quello è semplice) il problema è che non so come arrestare il contatore considerando che lui inserirà un solo \
 
Grazie per la risposta,ho scritto quel main per testare la funzione tuttavia il problema è che il prof inserirà una stringa del tipo c:\aaa\bbb\ccc
sicuramente saprete meglio di me che lo standard del c richiede \\ per inserire un singolo \,il probklema è proprio quello io posso iterare al contrario allocare con la calloc ecc (quello è semplice) il problema è che non so come arrestare il contatore considerando che lui inserirà un solo \
Non potra mai inserire un solo \. In C \ determina un carattere di escape
 
Grazie per la risposta,ho scritto quel main per testare la funzione tuttavia il problema è che il prof inserirà una stringa del tipo c:\aaa\bbb\ccc
sicuramente saprete meglio di me che lo standard del c richiede \\ per inserire un singolo \,il probklema è proprio quello io posso iterare al contrario allocare con la calloc ecc (quello è semplice) il problema è che non so come arrestare il contatore considerando che lui inserirà un solo \
"cosa intendi per "inserira'"? Inserisce dove? Input da tastiera? In quel caso non c'e ambiguita', ci sara' solo un solo carattere '\' e basta, che C non iterpretera' come l'inizio di un carattere speciale. Il codice che hai postato e' corretto, e' solo la condizione che e' sbagliata:
Codice:
while (str[i] == '\\')
pensaci su: sei sicuro ci voglia un test di uguaglianza?
PS non c'e' bisogno che usi calloc, una semplice malloc e' sufficiente e in questo caso piu' efficiente.
 
Non potra mai inserire un solo \. In C \ determina un carattere di escape
Fobia cosi sembrava...Comubque per l'allocazione del doppio puntatore dovrei fare
C:
path=malloc(numero dei caratteri fino a \ * la dimensione di un char)
for(size_t i=0;i<numcaratterifinoa\;i++)
*path[i]=calloc(1,sizeof(char)
o sbaglio devo ammettere che non mi sono molto chiari
 
"cosa intendi per "inserira'"? Inserisce dove? Input da tastiera? In quel caso non c'e ambiguita', ci sara' solo un solo carattere '\' e basta, che C non iterpretera' come l'inizio di un carattere speciale. Il codice che hai postato e' corretto, e' solo la condizione che e' sbagliata:
Codice:
while (str[i] == '\\')
pensaci su: sei sicuro ci voglia un test di uguaglianza?
PS non c'e' bisogno che usi calloc, una semplice malloc e' sufficiente e in questo caso piu' efficiente.
come farei allora a sapere la dimensione altrimenti? in quel modo sottraggo un fino a che dalla fine della stringa non trovo un \ potrei usare la libreria ctype.h e vedere se il successivo è una lettera, ma è identico
 
come farei allora a sapere la dimensione altrimenti? in quel modo sottraggo un fino a che dalla fine della stringa non trovo un \ potrei usare la libreria ctype.h e vedere se il successivo è una lettera, ma è identico
Comunque non so se hai capito bene, ma in memoria il carattere \ è rappresentato come \ (in ASCII ovviamente). ‘\\’ è il modo di rappresentare \ in C, ma poi il carattere è unico e non sono due \
 
Fobia cosi sembrava...Comubque per l'allocazione del doppio puntatore dovrei fare
C:
path=malloc(numero dei caratteri fino a \ * la dimensione di un char)
for(size_t i=0;i<numcaratterifinoa\;i++)
*path[i]=calloc(1,sizeof(char)
o sbaglio devo ammettere che non mi sono molto chiari
Chiaramente non afferri il concetto (senza offesa, stai imparando)
Questo non e' un "puntatori di puntatori", e' un semplice "puntatore a UN puntatore".

Nella funzione, definisci un puntatore, e lo inizializzi con una malloc pari alla lunghezza che vuoi.
Poi ci copi dentro parte del contenuto del vettore originale (inizio o fine, non importa).
Alla fine assegni al "contenuto" del parametro di ritorno (mediante il simbolo *) il valore del puntatore locale. Tutto qui.
Quello che stai facendo (allocare memoria per ogni elemento dei valori allocati) e' completamente sbagliato.

Codice:
extern void path_split(const char *str, char **path, char **filename)
{
    char *localP, *localF;

    localP = (char *)malloc(dimensione_che_vuoi + 1 per il terminatore)
    for (int i ....)
        localP[i] = path[ ...];

    ....

    *path = localP;
    *filename = localF;
}
 
Chiaramente non afferri il concetto (senza offesa, stai imparando)
Questo non e' un "puntatori di puntatori", e' un semplice "puntatore a UN puntatore".

Nella funzione, definisci un puntatore, e lo inizializzi con una malloc pari alla lunghezza che vuoi.
Poi ci copi dentro parte del contenuto del vettore originale (inizio o fine, non importa).
Alla fine assegni al "contenuto" del parametro di ritorno (mediante il simbolo *) il valore del puntatore locale. Tutto qui.
Quello che stai facendo (allocare memoria per ogni elemento dei valori allocati) e' completamente sbagliato.

Codice:
extern void path_split(const char *str, char **path, char **filename)
{
    char *localP, *localF;

    localP = (char *)malloc(dimensione_che_vuoi + 1 per il terminatore)
    for (int i ....)
        localP[i] = path[ ...];

    ....

    *path = localP;
    *filename = localF;
}
ti ringrazio per la risposta , nessuna offesa,non avevo davvero chiaro il concetto effettivamente ho allocato spazio per una matrice e non sono stato in grado di capire.In effetti mi sono reso conto di quanto stupido sia stato, credo anche di aver reso il problema più difficile di quanto non fosse. Mi è molto più chiaro adesso,vi ringrazio @Andretti60 @_Achille per il tempo perso,purtroppo ho saltato qualche lezione e non mi è stato tutto chiaro sin da subito
 
Comunque non so se hai capito bene, ma in memoria il carattere \ è rappresentato come \ (in ASCII ovviamente). ‘\\’ è il modo di rappresentare \ in C, ma poi il carattere è unico e non sono due \
Si questo fortunatamente era l'unica cosa che era chiara al 100%
 
Pubblicità
Pubblicità
Indietro
Top