Vai al contenuto

Comportamento Anomalo Programma In C


Messaggi raccomandati

Salve a tutti.

Ho scritto questo codice in linguaggio C per provare a fare la pulizia dello stream di input di alcune variabili:

 

 

#include <stdio.h>

int main() {
int anni;
char nome;
printf("\nInserisci il numero di anni: ");
do {
scanf("%d", &anni);
printf("\nHai inserito anni = %d", anni);
if (anni==0){
/* funzione che pulisce lo stream di input della variabile anni */
while(anni=getchar()!='\n' && anni!=EOF);
/* while((anni=getchar()!='\n') && (anni!=EOF)); */
printf("\nSe anni=0 -> Nuovo valore di anni = %d", anni);
printf("\nIl valore inserito non è corretto. Inseriscilo nuovamente: ");
}
} while (anni==0);
printf("\n\nCome ti chiami? (iniziale del tuo nome) ");
/* funzione che pulisce lo stream di input della variabile nome */
while(nome=getchar()!='\n' && nome!=EOF);
/*  while((nome=getchar()!='\n') && (nome!=EOF)); */
scanf("%c", &nome);
printf("\n\nI tuoi dati sono: \n Nome: \t %c \n Anni: \t %d", nome, anni);
printf("\n\n\n\n");
 
 
return 0;
}
 

 

 

tale codice mi serve per impedire che l'utente inserisca variabili non valide (ad esempio lettere invece di numeri).

Il programma, quando viene eseguito, alla scansione di interi, se riceve lettere converte queste in interi (codice ASCII) ma io non voglio che accada per cui ho inserito dei controlli vari.

 

Tra i commenti trovate il codice che gira su OS X. Il codice è stato scritto su Linux Mint ma a me interessa farlo girare su OS X.

 

Questo è ciò che accade:

 

Linux Mint

 

Schermata_2016_04_24_alle_14_07_25.png

 

MAC OS X EL CAPITAN

 

Schermata_2016_04_24_alle_14_08_23.png

 

 

Qual'è la causa di questo problema?

E come posso risolverlo?

 

Grazie in anticipo a quanti mi risponderanno.  :confused: 

 

 

 

 

 

Link al commento
Condividi su altri siti

ciao, il problema è in realtà molto banale e dipende dal fatto che gcc che hai su mac è leggermente diverso da gcc che hai su linux (e in questo caso è più preciso a quanto pare).

 

problema 1:

le variabili in C non hanno un valore di default quando le dichiari... quindi è buona norma inizializzarle.

int anni = 0;
char nome = '\0';

questo fa sì che il valore sia pulito.

 

problema 2:

a questo punto usare un do while non ha più alcuna utilità perchè visto che il valore di anni è inizializzato a 0 l'entrata nel ciclo è garantita almeno la prima volta.

 

di conseguenza il codice completo diventa:

#include <stdio.h>
int main() {
	int anni = 0;
	char nome = '\0';
	printf("\nInserisci il numero di anni: ");
	while (anni==0) {
		scanf("%d", &anni);
		printf("\nHai inserito anni = %d", anni);
		if (anni==0){
			/* funzione che pulisce lo stream di input della variabile anni */
			while(anni=getchar()!='\n' && anni!=EOF);
			/* while((anni=getchar()!='\n') && (anni!=EOF)); */
			printf("\nSe anni=0 -> Nuovo valore di anni = %d", anni);
			printf("\nIl valore inserito non è corretto. Inseriscilo nuovamente: ");
		}
	}
	printf("\n\nCome ti chiami? (iniziale del tuo nome) ");
	/* funzione che pulisce lo stream di input della variabile nome */
	while(nome=getchar()!='\n' && nome!=EOF);
	/*  while((nome=getchar()!='\n') && (nome!=EOF)); */
	scanf("%c", &nome);
	printf("\n\nI tuoi dati sono: \n Nome: \t %c \n Anni: \t %d", nome, anni);
	printf("\n\n\n\n");
 
 
	return 0;
}

Come mi sono accorto del problema?

ho provato a mettere 0 alla prima iterazione... dopo di essa il programma si comportava nella maniera voluta. L'intuizione è stata "inizializzazione variabili mancante" (è una delle prime cose che guardo in un programma C).

 

Detto questo prova, adesso dovrebbe funzionare... spero anche di averti spiegato in modo semplice come cambiare il programma e perchè.

 

PS. per scrivere codice nei messaggi c'è l'apposito pulsante code <> con quella forma.

Link al commento
Condividi su altri siti

ciao, il problema è in realtà molto banale e dipende dal fatto che gcc che hai su mac è leggermente diverso da gcc che hai su linux (e in questo caso è più preciso a quanto pare).

 

problema 1:

le variabili in C non hanno un valore di default quando le dichiari... quindi è buona norma inizializzarle.

int anni = 0;
char nome = '\0';

questo fa sì che il valore sia pulito.

 

problema 2:

a questo punto usare un do while non ha più alcuna utilità perchè visto che il valore di anni è inizializzato a 0 l'entrata nel ciclo è garantita almeno la prima volta.

 

di conseguenza il codice completo diventa:

#include <stdio.h>
int main() {
	int anni = 0;
	char nome = '\0';
	printf("\nInserisci il numero di anni: ");
	while (anni==0) {
		scanf("%d", &anni);
		printf("\nHai inserito anni = %d", anni);
		if (anni==0){
			/* funzione che pulisce lo stream di input della variabile anni */
			while(anni=getchar()!='\n' && anni!=EOF);
			/* while((anni=getchar()!='\n') && (anni!=EOF)); */
			printf("\nSe anni=0 -> Nuovo valore di anni = %d", anni);
			printf("\nIl valore inserito non è corretto. Inseriscilo nuovamente: ");
		}
	}
	printf("\n\nCome ti chiami? (iniziale del tuo nome) ");
	/* funzione che pulisce lo stream di input della variabile nome */
	while(nome=getchar()!='\n' && nome!=EOF);
	/*  while((nome=getchar()!='\n') && (nome!=EOF)); */
	scanf("%c", &nome);
	printf("\n\nI tuoi dati sono: \n Nome: \t %c \n Anni: \t %d", nome, anni);
	printf("\n\n\n\n");
 
 
	return 0;
}

Come mi sono accorto del problema?

ho provato a mettere 0 alla prima iterazione... dopo di essa il programma si comportava nella maniera voluta. L'intuizione è stata "inizializzazione variabili mancante" (è una delle prime cose che guardo in un programma C).

 

Detto questo prova, adesso dovrebbe funzionare... spero anche di averti spiegato in modo semplice come cambiare il programma e perchè.

 

PS. per scrivere codice nei messaggi c'è l'apposito pulsante code <> con quella forma.

Grazie mille!!  :ok:

Link al commento
Condividi su altri siti

Archiviato

Questa discussione è archiviata e chiusa a future risposte.

×
×
  • Crea Nuovo...