Funzione elimina_spazi

di il
32 risposte

Funzione elimina_spazi

Ho creato una funzione che controlla gli spazi di una stringa data in input e mi ritorna 0 se la stringa è errata, 1 se la stringa è corretta

int controllo_spazi (char * str)
{
    int x=1;
    for (int i=0; i<str[i]; i++) {
        if (str[i]==' ')
            x=0;
    }
    return x;
}
Questo è 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;
}
Non mi stampa il mio codice fiscale perchè non mi stampa il codice catastale del luogo inserito, ma stampa il codice fiscale col codice catastale dell'ultimo luogo che legge nel file .txt. Come mai?

32 Risposte

  • Re: Funzione elimina_spazi

    Non si è capito nulla del problema e devi mostrare il contenuto del file dati
  • Re: Funzione elimina_spazi

    Prova.txt
    varese
    tradate
    bustoarsizio
    milano
    codici.txt
    l682
    l319
    b300
    f205
  • Re: Funzione elimina_spazi

    oregon ha scritto:


    Non si è capito nulla del problema
    Confermo! In base a quali criteri stabilisci se una stringa è corretta oppure sbagliata?
  • Re: Funzione elimina_spazi

    Se contiene ' ' è sbagliata. Es: "busto arsizio" è sbagliata perché c'è lo spazio. Milano è giusta perché non ci sono spazi
  • Re: Funzione elimina_spazi

    Fabio97 ha scritto:


    Se contiene ' ' è sbagliata. Es: "busto arsizio" è sbagliata perché c'è lo spazio. Milano è giusta perché non ci sono spazi
    Allora ti basta scandire la stringa ed uscire appena trovi uno spazio. Se invece arrivi fino in fondo senza trovarne, allora la stringa è ok.

    Anche questo tipo di controlli sono piuttosto standard.
  • Re: Funzione elimina_spazi

    Ma infatti l'ho scritto nella funzione
    
    int controllo_spazi (char * str)
    {
        int x=1;
        for (int i=0; i<str[i]; i++) {
            if (str[i]==' ')
                x=0;
        }
        return x;
    }
    
    
  • Re: Funzione elimina_spazi

    Cosa significa
    i<str[i]
    ???
  • Re: Funzione elimina_spazi

    Equivale a
    
    i < strlen(str)
    
    Comunque la funzione funziona
  • Re: Funzione elimina_spazi

    Fabio97 ha scritto:


    Equivale a
    
    i < strlen(str)
    
    Eh???
    Non credo proprio! str significa l'i-esimo elemento della stringa (contando ovviamente da zero). Invece strlen (che è corretta) restituisce la lunghezza della stringa.
  • Re: Funzione elimina_spazi

    Comunque la funzione funziona lo stesso
  • Re: Funzione elimina_spazi

    Credimi: se funziona con i<str è solo un caso! Provando con altre stringhe, vedrai che non funziona. Semplicemente perché non ha senso.

    Comunque questo è un esempio:

    
    #include <stdio.h>
    #include <string.h>
    
    int controllo_spazi (char * str)
    {
        int x=1;
        int i = 0;
        for (i=0; i<strlen(str); i++) {
            if (str[i]==' ')
            {
                x=0;
                break;
            }
        }
        return x;
    }
    
    
    int main(int argc, char **argv) {
    	char *stringa = "Stringa di prova";
    	char *stringa_no_spazi = "Stringasenzaspazi";
    
    	printf("Prima stringa: %d\n", controllo_spazi(stringa));
    	printf("Seconda stringa: %d\n", controllo_spazi(stringa_no_spazi));
    
    	return 0;
    }
    
  • Re: Funzione elimina_spazi

    Fabio97 ha scritto:


    //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 != '\n') i++;
    buffer = '\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);
    }
    [/code]
    Non mi stampa il mio codice fiscale perchè non mi stampa il codice catastale del luogo inserito, ma stampa il codice fiscale col codice catastale dell'ultimo luogo che legge nel file .txt. Come mai?

    L'errore è probabilmente qua dentro
  • Re: Funzione elimina_spazi

    Fabio97 ha scritto:


    Comunque la funzione funziona lo stesso

    E le marmotte fanno la cioccolata ...
  • Re: Funzione elimina_spazi

    Ok ho cambiato i<str con i<strlen(str) ma fa comunque quello che faceva prima, quindi il programma non funziona correttamente
Devi accedere o registrarti per scrivere nel forum
32 risposte