[RISOLTO][c] Estrarre sottostringa da stringa

di il
21 risposte

21 Risposte - Pagina 2

  • Re: [RISOLTO][c] Estrarre sottostringa da stringa

    Non uso nessun IDE o cose del genere quindi non ti posso aiutare,mi spiace; però definire DEBUG (puoi anche chiamarla W_VOID_MAIN,ad esempio non è una macro speciale) richiede poco tempo in ogni caso.

    Per la seconda questione credo che non ci sia metodo migliore e che bisogna copiare la stringa per forza. Scorrere l'array linearmente dovrebbe richiedere un tempo del tipo O(n) mentre gli altri metodi hanno prestazioni peggiori. Ovviamente il tutto va preso con cautela dato che non ci capisco nulla di informatica-elettronica-matematica.

    EDIT: giusto perché tu lo sappia argv è modificabile.
  • Re: [RISOLTO][c] Estrarre sottostringa da stringa

    Una volta ho tentato di modificarlo e mi ha dato errore VS..
    Credevo che le stringhe fossero const... sarà stato un'altro errore...
    Domani cerco di sistemare le funzione e la posto...
  • Re: [RISOLTO][c] Estrarre sottostringa da stringa

    In C le stringhe non sono immutabili e il qualificatore const serve a ben poco perché il vincolo di sola lettura è limitato all'identificatore che segue dopo la keyword const. Basta usare un puntatore alla variabile precedente ed ecco fatto che si può comunque alterarne il valore. È sufficiente fare una prova del genere:
    
    #include <stdio.h>
    #include <stdlib.h>
    
    int main(void)
    {
            const int a = 10;
            int *b = &a;
            *b = 20;
            printf("a vale %d\n",a);
            return EXIT_SUCCESS;
    }
    
    Però ciò dipende anche dal compilatore. Qui mostro le differenze tra GCC e Clang.
    Clang non permette la modifica di variabili dichiarate const.
    
    xenon@cray-1:~$ clang -Weverything -std=c89 -O0 -g const.c
    const.c:7:7: warning: initializing 'int *' with an expression of type
          'const int *' discards qualifiers
          [-Wincompatible-pointer-types-discards-qualifiers]
            int *b = &a;
                 ^   ~~
    1 warning generated.
    xenon@cray-1:~$ ./a.out
    a vale 10
    
    GCC invece si
    
    xenon@cray-1:~$ gcc -Wall -Wextra -g -O0 -std=c89 const.c
    const.c: In function ‘main’:
    const.c:7:11: warning: initialization discards ‘const’ qualifier from pointer target type [-Wdiscarded-qualifiers]
      int *b = &a;
               ^
    xenon@cray-1:~$ ./a.out
    a vale 20
    
  • Re: [RISOLTO][c] Estrarre sottostringa da stringa

    Ecco la versione aggiornata del programma
    
    #include <stdio.h>
    #include <string.h>
    
    #define MAX_DIM_PATH (256)
    
    int estraiNomeFile( char *pathProg , char *nomeProg , size_t maxDim )
    {
        /* ======================  DEFINIZIONE VARIABILI ======================= */
        char *ptrStart = NULL ;               /* Puntatore su carattere start    */
        char *ptrClose = NULL ;               /* Puntatore su carattere start    */
        char start = '\\';                    /* Precarattere iniziale nome      */
        char close = '.';                     /* Postcarattere finale nome       */
        size_t dimStart = 0;                  /* Dimensione stringa da ptrStart  */
        size_t dimClose = 0;                  /* Dimensione Stringa da ptrClose  */
        size_t dimFinal = 0;                  /* Dimensione Finale Nome Programma*/
        /* ===================================================================== */
    
        /* Controllo Input  */
        if( NULL == pathProg || NULL == nomeProg || 1 > maxDim )
        {
            if( NULL == pathProg )
            {
                fprintf( stderr , "%s" , "Percorso non valido!\n" );
            }
            if( NULL == nomeProg )
            {
                fprintf( stderr , "%s" , "puntatore per nomeProgramma non valido!\n" );
            }
            if( 1 > maxDim )
            {
                fprintf( stderr , "%s" , "Input DIMENSIONE MASSIMA NOme Programma non valida!\n" );
            }
            return 0;
        }
    
        /* Occorenza ultimo '\' */
        ptrStart = strrchr( pathProg , start );
        if( NULL == ptrStart )
        {
            fprintf( stderr , "Carattere \" %c \" non trovato\n" , start );
        } else
        {
            ptrStart++;  /* Punta al cartattere dopo '\' */
            dimStart = strlen( ptrStart );
        }
    
        /* Occorenza ultimo '.' per l'estensione */
        ptrClose = strrchr( pathProg , close );
        if( NULL == ptrStart )
        {
            fprintf( stderr , "Carattere \" %c \" non trovato\n" , close );
            dimClose = 0;
        } else
        {
            dimClose = strlen( ptrClose ) ;
        }
        dimFinal = (size_t)( ptrClose - ptrStart ) ;
    
        if( maxDim > dimFinal )
        {
            strncpy( nomeProg , ptrStart , strlen( ptrStart ) );
            nomeProg[dimFinal] = '\0';
        } else
        {
            fprintf( stderr , "%s" , "La dimensione del some eccede la dimensione massima " );
            strncpy( nomeProg , ptrStart , maxDim );
            nomeProg[maxDim] = '\0';
        }
    
        return dimFinal ;
    }
    
    /* main con stringhe modificabili e non */
    int main( int argc , char *argv[] )
    {
        char stringa[MAX_DIM_PATH] = "" ;
        int dim = 0;
    
        dim = estraiNomeFile( __FILE__ , stringa , MAX_DIM_PATH );
        puts( "" );
        printf( "Nome Programma = %s\n" , stringa );
        printf( "Dimensione nome programma = %d\n" , dim );
        dim = estraiNomeFile( argv[0] , stringa , MAX_DIM_PATH );
        puts( "" );
        printf( "Nome Programma = %s\n" , stringa );
        printf( "Dimensione nome programma = %d\n" , dim );
        return 0;
    }
    
  • Re: [RISOLTO][c] Estrarre sottostringa da stringa

    Ottimo lavoro
    Per questa parte non utilizzerei lo strlen():
            strncpy( nomeProg , ptrStart , strlen( ptrStart ) );
            nomeProg[dimFinal] = '\0';
    
    ma semplicemente dimFinal
            strncpy( nomeProg , ptrStart , dimFinal );
            nomeProg[dimFinal] = '\0';
    
  • Re: [RISOLTO][c] Estrarre sottostringa da stringa

    Giusto!

    Se il resto è apposto scrivo [RISOLTO] nel titolo.
  • Re: [RISOLTO][c] Estrarre sottostringa da stringa

    candaluar ha scritto:


    ottimo lavoro
    L'importante è crederci
    EDIT: appena ho tempo mi spiego meglio.
Devi accedere o registrarti per scrivere nel forum
21 risposte