Domanda

In che modo C gestisce la conversione tra numeri interi e caratteri? Supponi di aver dichiarato una variabile intera e chiedi all'utente un numero, ma inseriscono invece una stringa. Cosa succederebbe?

È stato utile?

Soluzione

L'input dell'utente è trattato come una stringa che deve essere convertita in un int usando atoi o un'altra funzione di conversione. Atoi restituirà 0 se la stringa non può essere interpretata come un numero perché contiene lettere o altri caratteri non numerici.

Puoi leggere qualcosa in più nella documentazione di atoi su MSDN - http://msdn.microsoft.com/en-us/library/yd5xkb5c (VS.80) aspx

Altri suggerimenti

Uh? Inserisci sempre una stringa. Quindi si analizza questa stringa in numero, con vari modi (chiedendo di nuovo, prendendo un valore predefinito, ecc.) Di gestire vari errori (overflow, caratteri errati, ecc.).

Un'altra cosa da notare è che in C, caratteri e numeri interi sono "compatibili". di qualche grado. Qualsiasi personaggio può essere assegnato a un int. Anche il contrario funziona, ma perderai informazioni se il valore intero non rientra in un carattere.

char foo = 'a'; // The ascii value representation for lower-case 'a' is 97
int bar = foo; // bar now contains the value 97 
bar = 255; // 255 is 0x000000ff in hexadecimal
foo = bar; // foo now contains -1 (0xff) 
unsigned char foo2 = foo; // foo now contains 255 (0xff)

Come hanno notato altre persone, i dati vengono normalmente inseriti come una stringa - l'unica domanda è quale funzione viene utilizzata per eseguire la lettura. Se si utilizza una GUI, la funzione potrebbe già gestire la conversione in numeri interi e riportare errori e quindi in modo appropriato. Se lavori con Standard C, è generalmente più semplice leggere il valore in una stringa (magari con fgets () e poi convertire. Sebbene atoi () possa essere usato, raramente è la scelta migliore; il problema è determinare se la conversione è riuscita (e ha prodotto zero perché l'utente ha inserito una rappresentazione legittima di zero) oppure no.

Generalmente, usa strtol () o uno dei suoi parenti ( strtoul () , strtoll () , strtoull () ); per convertire numeri in virgola mobile, utilizzare strtod () o una funzione simile. Il vantaggio delle routine di conversione di numeri interi include:

  • selezione base opzionale (ad esempio, base 10 o base 10 - esadecimale o base 8 - ottale, o una qualsiasi delle precedenti usando convenzioni C standard (007 per ottale, 0x07 per esadecimale, 7 per decimale).
  • rilevamento opzionale degli errori (sapendo dove è stata interrotta la conversione).

Il posto in cui vado per molte di queste specifiche di funzione (quando non guardo la mia copia dell'attuale standard C) è POSIX (che include le funzioni C99). È incentrato su Unix anziché su Windows.

Il programma si arresterebbe in modo anomalo, devi chiamare la funzione atoi.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top