Funzione elimina_spazi

di Anonimizzato14370 il
32 risposte

32 Risposte - Pagina 2

  • Fabio97 ha scritto:


    fa comunque quello che faceva prima, quindi il programma non funziona correttamente
    Questo è un altro discorso. Intanto quella funzione ora è corretta; poi il problema salterà fuori.
  • Che ci possano essere mille errori è probabile ma se dici che str e strlen sono la stessa cosa e che non ti va di cambiarlo, allora nessuno ti risponde più.
  • Io ho scritto in questo forum per far si che il problema salti fuori, ma ancora non è successo. Se sapevo risolvere da me il problema non avrei scritto qui.
  • Beh, se sei "seccato" da come ti rispondono, risolvi da solo o paga qualcuno per farlo ...
  • Ma non sono capace di risolvere da solo, chiedo per questo gentilmente se potete sistemarlo voi
  • oregon ha scritto:


    se dici che str e strlen sono la stessa cosa e che non ti va di cambiarlo, allora nessuno ti risponde più.
    Non ho detto che non mi va di cambiarlo
  • Quindi come posso fare per risolvere il problema? Rispondete per favore
  • Dunque... Io, come ho già scritto nell'altro thread, non ci capisco più nulla.
    Forse conviene che tu posti l'intero codice una volta per tutte. Dopodiché non ti resta che attendere che qualche anima pia (sempre ammesso che ci sia) si metta lì a guardarlo...
  • Ecco il codice completo
    
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <ctype.h>
    
    int controllo_spazi (char * str)
    {
        int x=1;
        for (int i=0; i<str[i]; i++) {
            if (str[i]==' ')
                x=0;
        }
        return x;
    }
    
    char * elimina_spazi (char * str)
    {
        int x=0, y=0, i;
        
        /* elimino il carattere "a capo" al termine della riga  */
        i = 0;
        while(str[i] != '\n') i++;
            str[i] = '\0';
        
        for (i=0; i<str[i]; i++) {
            if (str[i]==' ') {
                x=i;
                y=1;
                break;
            }
        }
        // codice che sposta le lettere
        if (y==1) {
            for (int i2=x; i2<str[i2]; i2++)
                str[i2]=str[i2+1];
        }
        
        return str;
    }
    
    int controllo_data (char * mese, char * giorno)
    {
        int x=0;
        if (strcmp(mese, "gennaio")==0 || strcmp(mese, "marzo")==0 || strcmp(mese, "maggio")==0 || strcmp(mese, "luglio")==0 || strcmp(mese, "agosto")==0 || strcmp(mese, "ottobre")==0 || strcmp(mese, "dicembre")==0) {
            if (atoi(giorno)<=31 && atoi(giorno)>=1)
                x=1;
        } else if (strcmp(mese, "aprile")==0 || strcmp(mese, "giugno")==0 || strcmp(mese, "settembre")==0 || strcmp(mese, "novembre")==0) {
            if (atoi(giorno)<=30 && atoi(giorno)>=1)
                x=1;
        } else if (strcmp(mese, "febbraio")==0) {
            if (atoi(giorno)<=28 && atoi(giorno)>=1)
                x=1;
        }
        return x;
    }
    
    int main(int argc, const char * argv[])
    {
        char cognome [30], cognome_cod[4], nome[30], nome_cod[5], anno[4], anno_cod[2], mese[10], mese_cod, giorno[3], sesso[2], conferma[2], luogo[30], luogo_cod[1024], codice[16], dispari[16], pari[16], carattere_controllo;
        int i2=0, giorno_int, val_pari=0, val_dispari=0, somma=0, resto=0;
        int i;
        
        printf("Inserire cognome: ");
        fgets(cognome, sizeof(cognome), stdin);
        strcpy(cognome, elimina_spazi(cognome));
        printf("Inserire nome: ");
        fgets(nome, sizeof(nome), stdin);
        strcpy(nome, elimina_spazi(nome));
        do
        {
        printf("Inserisci anno di nascita(aa): ");
        scanf("%s", anno);
        }
        //anno 1÷2014
        while (atoi(anno)<1 || atoi(anno)>2014 || strlen(anno)!=2);
        do
        {
            printf("Inserisci mese di nascita(lettere): ");
            scanf("%s", mese);
            do
            {
                printf("Inserisci sesso(m/f): ");
                scanf("%s", sesso);
            }
            while ((strcmp(sesso, "m")!=0) && (strcmp(sesso, "f")!=0));
            do
            {
                printf("Inserisci giorno di nascita(gg): ");
                scanf("%s", giorno);
            }
            while (atoi(giorno)<1 || atoi(giorno)>31 || strlen(giorno)==1);
        }
        while (controllo_data(mese, giorno) != 1);
        printf("Sei nato in Italia?(s/n): ");
        scanf("%s", conferma);
        
        //sviluppo calcoli per calcolare le lettere del cognome
        if (strlen(cognome)==2) {
            strcpy(cognome_cod,cognome);
            cognome_cod[2]='x';
        } else {
            for (i=0; i<strlen(cognome); i++) {
                if (cognome[i]!='a' && cognome[i]!='e' && cognome[i]!='i' && cognome[i]!='o' && cognome[i]!='u') {
                    cognome_cod[i2]=cognome[i];
                    i2++;
                }
                if (i2>2)
                    break;
            }
            if (strlen(cognome_cod)<=2) {
                for (i=0; i<strlen(cognome); i++) {
                    if (cognome[i]=='a' || cognome[i]=='e' || cognome[i]=='i' || cognome[i]=='o' || cognome[i]=='u') {
                        cognome_cod[2]=cognome[i];
                        break;
                    }
                }
            }
        }
        
        //sviluppo calcoli per calcolare le lettere del nome
        i2=0;
        if (strlen(nome)==2) {
            strcpy(nome_cod,nome);
            nome_cod[2]='x';
        } else {
            for (i=0; i<strlen(nome); i++) {
                if (nome[i]!='a' && nome[i]!='e' && nome[i]!='i' && nome[i]!='o' && nome[i]!='u') {
                    nome_cod[i2]=nome[i];
                    i2++;
                }
                //spostare le lettere
                if (i2==4) {
                    nome_cod[0]=nome_cod[0];
                    for (i=1; i<4; i++) 
                        nome_cod[i]=nome_cod[i+1];
                }
                if (i2>3)
                    break;
            }
            if (strlen(nome_cod)<=2) {
                for (i=0; i<strlen(nome); i++) {
                    if (nome[i]=='a' || nome[i]=='e' || nome[i]=='i' || nome[i]=='o' || nome[i]=='u') {
                        nome_cod[2]=nome[i];
                        break;
                    }
                }
            }
        }
        
        //sviluppo calcoli per l'anno di nascita
        if (strlen(anno)==2) {
            strcpy(anno_cod, anno);
        } else {
            printf("\nAnno scritto nella forma errata!");
            return 0;
        }
            
        //sviluppo calcoli per il mese di nascita
        if(strcmp(mese,"gennaio")==0)
            mese_cod='a';
        if(strcmp(mese,"febbraio")==0)
            mese_cod='b';
        if(strcmp(mese,"marzo")==0)
            mese_cod='c';
        if(strcmp(mese,"aprile")==0)
            mese_cod='d';
        if(strcmp(mese,"maggio")==0)
            mese_cod='e';
        if(strcmp(mese,"giugno")==0)
            mese_cod='h';
        if(strcmp(mese,"luglio")==0)
            mese_cod='l';
        if(strcmp(mese,"agosto")==0)
            mese_cod='m';
        if(strcmp(mese,"settembre")==0)
            mese_cod='p';
        if(strcmp(mese,"ottobre")==0)
            mese_cod='r';
        if(strcmp(mese,"novembre")==0)
            mese_cod='s';
        if(strcmp(mese,"dicembre")==0)
            mese_cod='t';
        
        //sviluppo calcoli per il giorno di nascita
        //sesso di nascita
        if (strncmp(sesso,"f",2)==0) {
            //convertire giorno da stringa a intero
            giorno_int=atoi(giorno);
            //sommare 40 a giorno
            giorno_int+=40;
            //convertire giorn_int da intero a stringa
            sprintf(giorno,"%d", giorno_int);
        }
        
        //sviluppo calcoli per il luogo
        if (strncmp(conferma, "s", 2)==0) {
            do
            {
            printf("Inserisci luogo di nascita (senza lasciare spazi): ");
            fgets(luogo, sizeof(luogo), stdin); //qui non funziona
            }
            while (controllo_spazi(luogo) != 1);
    
            FILE * f = fopen ("prova.txt" , "r");
            if ( !f ) return -1;
            
            char buffer [1024];
            
            int conta_righe, i;
            
            /* inizializzo il contatore */
            conta_righe = 0;
            
            while(fgets (buffer , 1024 , f) != NULL)
            {
                /* ho letto una riga: aumento il contatore */
                conta_righe++;
                
                /* elimino il carattere "a capo" al termine della riga  */
                i = 0;
                while(buffer[i] != '\n') i++;
                    buffer[i] = '\0';
                
                /* confronto la stringa appena letta con il campione */
                if(strcmp(buffer, luogo) == 0)
                    break;
            }
            
            fclose(f);
            
            FILE * pf = fopen ("codici.txt" , "r");
            if ( !pf ) return -1;
            
            char buffer1 [1024];
            
            int riga_da_leggere;
            
            /* voglio leggere la riga corretta */
            riga_da_leggere = conta_righe;
            
            /* inizializzo il contatore */
            i = 0;
            
            while(i != riga_da_leggere)
            {
                if(fgets (buffer1 , 1024 , pf) == NULL)
                {
                    printf("Fine del file raggiunta.\n");
                    return -1;
                }
                i++;
            }
            
            strcpy(luogo_cod, buffer1);
            fclose(pf);
        } else {
            //nato all'estero
            printf("Inserisci stato di nascita: ");
            scanf("%s", luogo);
            if (strcmp(luogo, "albania")==0)
                strcpy(luogo_cod,"z100");
            if (strcmp(luogo, "ucraina")==0)
                strcpy(luogo_cod,"z138");
            if (strcmp(luogo, "grecia")==0)
                strcpy(luogo_cod,"z115");
            if (strcmp(luogo, "polonia")==0)
                strcpy(luogo_cod,"z127");
        }
        
        //copiare i caratteri in una variabile codice fiscale
        i2=0;
        for (i=0; i<3; i++)
            codice[i]=cognome_cod[i];
        for (i=3; i<6; i++) {
            codice[i]=nome_cod[i2];
            i2++;
        }
        i2=0;
        for (i=6; i<8; i++) {
            codice[i]=anno_cod[i2];
            i2++;
        }
        codice[8]=mese_cod;
        i2=0;
        for (i=9; i<11; i++) {
            codice[i]=giorno[i2];
            i2++;
        }
        i2=0;
        for (i=11; i<15; i++) {
            codice[i]=luogo_cod[i2];
            i2++;
        }
    
        //codice per il carattere di controllo
        int i_dispari=0, i_pari=0;
        for (i=0; i<strlen(codice); i++) {
          //dividere i caratteri pari dai caratteri dispari
            if((i%2)==1) {
                //caratteri pari(parte dall'indice 0)
                pari[i_pari]=codice[i];
                i_pari++;
            } else {
                dispari[i_dispari]=codice[i];
                i_dispari++;
            }
        }
        //assegnare il valore ai caratteri pari
        for (i=0; i<strlen(pari); i++) {
            if (pari[i] >= '0' && pari[i] <= '9')
                val_pari += pari[i] - '0';
            
            if (pari[i] >= 'a' && pari[i] <= 'z')
                val_pari += pari[i] - 'a';
        }
        
        //assegnare il valore ai caratteri dispari
        for (int i=0; i<strlen(dispari); i++) {
            if (strncmp(&dispari[i], "0", 1)==0)
                val_dispari+=1;
            if (strncmp(&dispari[i], "1", 1)==0)
                val_dispari+=0;
            if (dispari[i] >= '2' && dispari[i] <= '4')
                val_dispari+=(dispari[i] - '0') + (dispari[i] - '0' + 1);
            if (dispari[i] >= '5' && dispari[i] <= '9')
                val_dispari+=(dispari[i] - '0') + (dispari[i] - '0' + 3);
            if (strncmp(&dispari[i], "a", 1)==0)
                val_dispari+=1;
            if (strncmp(&dispari[i], "b", 1)==0)
                val_dispari+=0;
            if (dispari[i] >= 'c' && dispari[i] <= 'e')
                val_dispari+=(dispari[i] - 'a') + (dispari[i] - 'a' + 1);
            if (dispari[i] >= 'f' && dispari[i] <= 'j')
                val_dispari+=(dispari[i] - 'a') + (dispari[i] - 'a' + 3);
            if (dispari[i] >= 'k' && dispari[i] <= 'l')
                val_dispari+=(dispari[i] - 'a') + (dispari[i] - 'a' - 18);
            if (dispari[i] >= 'm' && dispari[i] <= 'n')
                val_dispari+=(dispari[i] - 'a') + (dispari[i] - 'a' - 6);
            if (strncmp(&dispari[i], "o", 1)==0)
                val_dispari+=11;
            if (strncmp(&dispari[i], "p", 1)==0)
                val_dispari+=3;
            if (dispari[i] >= 'q' && dispari[i] <= 'r')
                val_dispari+=(dispari[i] - 'a') + (dispari[i] - 'a' - 26);
            if (dispari[i] >= 's' && dispari[i] <= 'u')
                val_dispari+=(dispari[i] - 'a') + (dispari[i] - 'a' - 24 );
            if (strncmp(&dispari[i], "v", 1)==0)
                val_dispari+=10;
            if (strncmp(&dispari[i], "w", 1)==0)
                val_dispari+=22;
            if (strncmp(&dispari[i], "x", 1)==0)
                val_dispari+=25;
            if (strncmp(&dispari[i], "y", 1)==0)
                val_dispari+=24;
            if (strncmp(&dispari[i], "z", 1)==0)
                val_dispari+=23;
            if (strncmp(&dispari[i], "\0", 1)==0)
                val_dispari+=0;
        }
        
        //sommare i valori pari e i valori dispari
        somma=val_pari+val_dispari;
        //calcolare il resto dividendo per 26 il risultato
        resto=somma%26;
        
        //assegnare ad ogni valore da 0 a 25 il carattere corrispondente
        char a='a';
        for (i=0; i<=25; i++) {
            if (resto==i) 
                carattere_controllo=a;
            a++;
        }
        
        codice[15]=carattere_controllo;
        codice[16]='\0';
        
        //caratteri maiuscoli e stampa dell'output
        for (int i=0; i<codice[i]; i++) 
            codice[i]=toupper(codice[i]);
        
        printf("\n%s\n, codice);
        return 0;
    }
    
    Con questa funzione non funziona
    //sviluppo calcoli per il luogo
        if (strncmp(conferma, "s", 2)==0) {
            do
            {
            printf("Inserisci luogo di nascita (senza lasciare spazi): ");
            fgets(luogo, sizeof(luogo), stdin); //qui non funziona
            }
            while (controllo_spazi(luogo) != 1);
    
    Se uso questa funzione non va
    fgets(luogo, sizeof(luogo), stdin);
    Se uso scanf va ma non la devo usare
            scanf("%s", luogo);
    
    Grazie
  • Spero abbiate capito
  • Attenzione perché la fgets ti restituisce la stringa letta ma comprensiva del carattere di fine linea '\n'. Sta poi a te andarlo a rimuovere manualmente...
    In realtà la cosa è semplice: basta sostituire '\n' con '\0', ma se non ci pensi puoi avere problemi.

    Inoltre dovresti chiarire il significato di "non va"...
  • Avevo iniziato a guardare il codice, ma mi fermo subito... Riporto le prime righe:
    
    int controllo_spazi (char * str)
    {
        int x=1;
        for (int i=0; i<str[i]; i++) {
            if (str[i]==' ')
                x=0;
        }
        return x;
    }
    
    char * elimina_spazi (char * str)
    {
        int x=0, y=0, i;
        
        /* elimino il carattere "a capo" al termine della riga  */
        i = 0;
        while(str[i] != '\n') i++;
            str[i] = '\0';
        
        for (i=0; i<str[i]; i++) {
            if (str[i]==' ') {
                x=i;
                y=1;
                break;
            }
        }
        // codice che sposta le lettere
        if (y==1) {
            for (int i2=x; i2<str[i2]; i2++)
                str[i2]=str[i2+1];
        }
        
        return str;
    }
    
    Per ben tre volte, nei cicli for, c'è i<str quando io, oregon e altri ti abbiamo detto che non ha senso!

    Così non si va avanti. Vuoi lasciare i<str perché credi che sia equivalente a strlen? Benissimo!
  • Fabio97 ha scritto:


    oregon ha scritto:


    se dici che str e strlen sono la stessa cosa e che non ti va di cambiarlo, allora nessuno ti risponde più.
    Non ho detto che non mi va di cambiarlo
    Come vedi ...
  • Fabio97 ha scritto:


    Spero abbiate capito
    Noi?
  • Scusate avete ragione voi non mi ero accorto di non aver cambiato con strlen.. ora lo cambio
Devi accedere o registrarti per scrivere nel forum
32 risposte