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?