Problemi con ciclo for e vettore[Fantasma]

di il
5 risposte

Problemi con ciclo for e vettore[Fantasma]

Ciao, stavo scrivendo un programma che riceve in input una frase in codice morse e restituisce in output la frase traslitterata, ma ho un problema del quale non riesco a venire a capo...

per comodità mi sono limitato alle prime 3 lettere dell'alfabeto scrivendo quanto segue
#include <stdio.h>
#include <ctype.h>
#include <string.h>

int main (void) 
	
{

	char frase[100] ;
	char *FraseTok[20] ; // vettore immagazzinamento token
	char *morse[] ={ ".-", "-...", "-.-." };
	char *alfa[] = { "a", "b", "c" } ;
	int c00, c01, c02, x ;
	int p1  ;
	
	puts("scrivi una frase in alfabeto morse");
	fgets ( frase, 20 , stdin) ;
	
	puts (frase);
	
	FraseTok[0] = strtok ( frase , " " ) ;
	
// dividere la frase in token 
	c00 = 1 ; // prepara il contatore 
	while ( FraseTok != NULL ) {
	
		FraseTok[c00] = strtok ( NULL , " " ) ;
		
		
		if (FraseTok[c00] == NULL) {
				break ;
		}
			else {
				c00++; 
			}
	}
	x = c00 ; 
	
	for ( c01 = 0 ; c02 <= x ; c01++) {
		for ( c02 = 0 ; c02 <= 2 ; c02++) {
			
			p1 = strcmp (FraseTok[c01], morse[c02]) ;
			
			if ( p1 == 0 ) {
				
				printf ("%s", alfa[c02]);
			}

		}
		c01++;
	}
	puts ("");
	return 0;
}
digitavo : ".- -... -.-."

aspettandomi come output "abc"

l'output di questo programma risultava essere sempre un segmentation fault ho scoperto che era dovuto al valore di x = c00 che se sostituito da x = c00 - 1 concludeva il programma, ma con l'output :

ab

ovviamente saltando la c...

allora ho aggiunto una stampa forzata di FraseTok, perchè non riuscivo a capire da dove nascesse il problema :
c01 = 0 ;
	printf ("%d) %s\n",c01,FraseTok[c01]);
	c01++;
	printf ("%d) %s\n",c01,FraseTok[c01]);
	c01++;
	printf ("%d) %s\n",c01,FraseTok[c01]);
	c01++;
	printf ("%d) %s\n",c01,FraseTok[c01]);
che mi da questo output :

0) .-
1) .-
2) .-

3) (null)

Ora qualcuno sa spiegarmi perchè leggendo un vettore[4] l'output è :

0 , 1 , 2, \n , 3 ?

5 Risposte

  • Re: Problemi con ciclo for e vettore[Fantasma]

    Secondo me dovresti semplificare; dovresti scrivere una funzione che dato in input una stringa morse restituisce il carattere e il puntatore (nella stringa morse) al prossimo codice morse.
    Es.
    char *GetNextChar( char *morse, char *c )
    Questa funzione si occupa solo di leggere la stringa morse fino al raggiungimento dello spazio o del fine stringa, quindi confrontare questo codice con la tua lista di codici e ritornare in *c il carattere e come valore di ritorno il puntatore a dopo lo spazio o NULL se la stringa è finita (o il carattere non è stato riconosciuto).
    E basta.
    Per decodificare una stringa ti basterà fare un ciclo su GetNextChar() finchè questa non ritorna NULL.
    Spero di averti dato un buono spunto
  • Re: Problemi con ciclo for e vettore[Fantasma]

    Ti ringrazio in effetti sarebbe più semplice, ma devo capire anche perchè quel programma non gira.
    Se mi ripresenta un problema simile mi ritroverei punto da capo e magari senza alcuna via di fuga...
  • Re: Problemi con ciclo for e vettore[Fantasma]

    Se mi ripresenta un problema simile mi ritroverei punto da capo e magari senza alcuna via di fuga...
    Se affronti un problema suddividendolo in sottoproblemi semplifichi di molto non solo la scrittura dell'algoritmo ma anche (di conseguenza) la soluzione di un eventuale bug.
    Secondo me, il codice che hai postato è troppo complicato e difficilmente riutilizzabile (tutto nel main...).
    Comunque queste sono solo mie considerazioni.
  • Re: Problemi con ciclo for e vettore[Fantasma]

    Il codice qui di seguito è quello che intendevo:
    - c'è una funzione che traduce un singolo codice
    - c'è una funzione che isola il codice nella stringa e lo traduce per mezzo della funzione qui sopra
    - c'è una funzione che dato un "elenco" di codici separati da spazi traduce tutto per tramite della funzione qui sopra
    - infine dal main posso provare i singoli blocchettini
    #include <stdio.h>
    #include <ctype.h>
    #include <string.h>
    
    #define N_CODES         3
    #define MAX_CODELEN     20
    
    // converte un codice morse in carattere ASCII
    // ritorna 0 se non è corretto
    char ConvertMorseToChar( char *morsechar )
    {
        char *morse[N_CODES] ={ ".-", "-...", "-.-." };
        char car[N_CODES]    ={ 'a',  'b',    'c' };
        int i;
        int len = strlen( morsechar );
    
        for( i=0; i<N_CODES; i++ )
        {
            if( strlen( morse[i] ) == len )
                if( strcmp( morsechar, morse[i] ) == 0 )
                    return car[i];
        }
    
        return 0;
    }
    
    // estrapola il primo codice morse e lo trasforma in carattere ASCII in c
    // ritorna il puntatore al prossimo codice o
    // ritorna NULL se il codice non è stato riconosciuto
    char *GetNextChar( char *morse, char *c )
    {
        char tmp[ MAX_CODELEN ];
        int cnt;
        char *pmorse;
    
        strcpy( tmp, "" );
        pmorse = morse;
        cnt = 0;
        while( *pmorse )
        {
            if( *pmorse == ' ' )                                // fine carattere morse
            {
                pmorse ++;
                break;
            }
    
            if( *pmorse == NULL )                               // fine stringa
                break;
    
            if( ( *morse != '.' ) && ( *morse != '-' ) )        // carattere non ammesso
                return NULL;
    
            tmp[ cnt ] = *pmorse;
            tmp[ cnt+1 ] = 0;
    
            cnt ++;
            if( cnt >= ( MAX_CODELEN-1 ))                       // campo troppo lungo
                return NULL;
    
            pmorse ++;
        }
    
        if( strlen( tmp ) <= 0 )
            return NULL;
    
        *c = ConvertMorseToChar( tmp );
        if( *c == 0 )
            return NULL;
    
        return pmorse;
    }
    
    // converte una stringa di codici morse separati da spazio
    // in una stringa di caratteri ASCII corrispondenti
    // ritorna 1 se ha trovato qualcosa
    int ConvertMorseToString( char *morsestr, char *outstr, int maxstr )
    {
        char c;
        char *p;
        int i;
    
        strcpy( outstr, "" );
    
        p = morsestr;
        i = 0;
        while( 1 )
        {
            p = GetNextChar( p, &c );
            if( p == NULL )
                break;
            outstr[i] = c;
            outstr[i+1] = 0;
            i ++;
    
            if( i >= (maxstr-1))
                break;
        }
    
        if( strlen( outstr ) > 0 )
            return 1;
    
        return 0;
    }
    
    int main (void)
    {
        char outstr[ 80 ];
        char c;
        char *p;
    
        printf( "test riconoscimento singolo codice\n");
        c = ConvertMorseToChar( "-.-." );
        if( c )
            printf( "ConvertMorseToChar( \"-.-.\" ) = %c\n", c );
        else
            printf( "ConvertMorseToChar( \"-.-.\" ) = ERR\n" );
    
        c = ConvertMorseToChar( "-.-.X" );
        if( c )
            printf( "ConvertMorseToChar( \"-.-.X\" ) = %c\n", c );
        else
            printf( "ConvertMorseToChar( \"-.-.X\" ) = ERR\n" );
    
        ConvertMorseToString( "-... .- -.-. -.-. .-", outstr, 80 );
        printf( "ConvertMorseToString( \"-... .- -.-. -.-. .-\" ) = %s\n", outstr );
    
        ConvertMorseToString( "-... .- -.-. .- XXXX", outstr, 80 );
        printf( "ConvertMorseToString( \"-... .- -.-. .- XXXX\" ) = %s\n", outstr );
    
        return 0;
    }
    
    Ho inserito solo 3 codici, ma aggiungere i restanti diventa molto semplice!
  • Re: Problemi con ciclo for e vettore[Fantasma]

    Ho risolto, il problema stava nel fatto che l'ultimo token si chiudeva con '\n' , quindi ho inserito una semplice ciclo for che fa scorrere la frase ed elimina il carattere newline.

    Grazie
Devi accedere o registrarti per scrivere nel forum
5 risposte