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