Originariamente inviato da MItaly
Stai facendo molta confusione.
In primis, fflush(stdin) non è portabile; alcuni compilatori (ad esempio VC++) ne consentono l'uso per svuotare il buffer di input, con altri (gcc) non fa niente; in generale, lo standard ne prevede l'uso solo per i file aperti in output, quindi evita fflush(stdin).
Perché
1) stai usando lo specificatore di formato "%d" quando quello che vuoi acquisire non è un intero. Se inserisci X, la scanf vede un carattere che non è un intero e quindi non lo acquisisci;
2) ancora peggio, stai usando "%d" ma passando un puntatore a char! Questo fa sì che la scanf vada a sfasciare lo stack, corrompendo i dati delle variabili locali. Se vuoi acquisire caratteri devi usare %c e una variabile char, se vuoi acquisire numeri usi %d e una variabile int.
È ancora sbagliato, per gli stessi motivi di cui sopra. E NULL si usa con i puntatori, non con i caratteri, per cui qui non c'entra niente.
Personalmente, io mi limiterei ad acquisire una stringa con tutto l'ISBN e poi farne il parsing separatamente.
codice:
char strISBN[100]={0};
int ISBN[10];
fgets(strISBN, sizeof(strISBN), stdin);
int i=0;
for(char *c=strISBN; *c && i<10; ++c, ++i)
{
if(c>='0' || c<='9') // converti i numeri
ISBN[i]=*c-'0';
else if(c=='x' || c=='X') // converti la X
ISBN[i]=10;
else if(c==' ' || c=='-' || c=='\n') // ignora i trattini e gli spazi
--i;
else
printf("Carattere non valido: %c", *c);
}