Visualizzazione dei risultati da 1 a 5 su 5

Discussione: Stringhe in C

  1. #1

    Stringhe in C

    Ciao a tutti , sto cercando di imparare il C , premetto che conosco già qualche altro linguaggio di programmazione , ma non capisco perchè ho delle notevoli difficoltà a fare le cose basilari.
    Spiego meglio il mio problema:

    devo scrivere un programma che legge due date nel formato g/m/a , le confronta e ritorni una stringa del tipo : la prima data è maggiore della seconda .

    sulla logica del programma non ho nessun problema mi servirebbe un aiuto su come gestire le stringhe :

    per esempio io leggo da input con lo scanf la data , una volta memorizzata vorrei fare una sorta di split sul carattere '/' e memorizzare i tre valori in tre variabili distinte oppure prendere i primi due valori e caricarli in una variabile, gli altri due caricarli in una seconda e gli ultimi in una terza.

    Mi date una mano per favore? Grazie a tutti .

  2. #2
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Per estrarre i singoli campi della data puoi ricorrere alla funzione strtok()

    http://www.cplusplus.com/reference/c...string/strtok/

    ti basterà riadattare il codice proposto come esempio, solo che come delimitatore dovrai impostare soltanto '/'.

    Per convertire le sottostringhe così ottenute in numeri, puoi ricorrere ad atoi() o a sscanf()

    http://www.cplusplus.com/reference/c.../cstdlib/atoi/
    http://www.cplusplus.com/reference/c...cstdio/sscanf/
    every day above ground is a good one

  3. #3
    Grazie per la risposta .

    Allora sto cerando di riadattare l'esempio al mio caso e sono riuscito a fare lo split.

    #include <stdio.h>
    #include <string.h>

    char str[10];

    int main ()
    {

    scanf("%s",&str);
    printf ("ho inserito ---> %s",str);

    char * pch;
    printf ("Splitting string \"%s\" into tokens:\n",str);
    pch = strtok (str,"/");
    while (pch != NULL)
    {
    printf ("%s\n",pch);
    pch = strtok (NULL, "/");
    }

    system("PAUSE");
    return 0;
    }


    Ho un altra domanda da fare (cerca di capire ma sono alle prime armi)

    invece di leggere i valori in questo modo

    while (pch != NULL)
    {
    printf ("%s\n",pch);
    pch = strtok (NULL, "/");
    }

    io vorrei prenderli singolarmente senza fare il while.

    come posso leggere il puntatore?

    ho provato a fare una cosa di questo tipo

    gg = pch[0];
    mm = pch[1];
    aa = pch[2];

    ma credo che sia sbagliato.

    Grazie

  4. #4
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Originariamente inviato da forzagaeta
    invece di leggere i valori in questo modo
    ...
    io vorrei prenderli singolarmente senza fare il while.
    Sicuro di averne bisogno?

    In ogni caso basta "srotolare" il ciclo while:

    codice:
        pch = strtok (str,"/");
        printf ("%s\n",pch);
        pch = strtok (NULL, "/");
        printf ("%s\n",pch);
        pch = strtok (NULL, "/");
        printf ("%s\n",pch);
    però fai attenzione perché in questo caso non fai alcun controllo su pch (che invece col ciclo while facevi in automatico nella sua condizione), quindi se per caso sbagliassi ad immettere la data, ad esempio nel formato g\m\a anziché g/m/a otterresti un errore run time in quanto una delle strtotk potrebbe restituire NULL come risultato e avresti il crash sulla printf() successiva. Altrimenti dovresti metterci dei controlli if tra le varie strtotk() ma questo renderebbe il tutto poco bello da vedersi, quindi per questo chiediti se ne hai davvero bisogno.
    In ogni caso, se hai la certezza che ogni data sarà sempre nel formato g/m/a, allora non avrai bisogno di alcun controllo, o al massimo potresti farne uno solo prima di ricorrere alla strtotk() appunto per verificare se la data sia stata inserita nel formato corretto: se non lo risultasse, gestiresti l'errore in qualche modo.
    every day above ground is a good one

  5. #5
    Hai ragione forse non ne avevo bisogno, ad ogni modo ho imparato una cosa nuova.

    Grazie

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.