2013-08-13 4 views
5

Sono ancora nuovo nel forum, quindi mi scuso in anticipo per il forum - problemi di etichetta.Differenze tra int/char array/stringhe

Non riesco a capire le differenze tra gli array int e gli array char.

Ho recentemente scritto un programma per un problema di Project Euler che originariamente utilizzava una matrice char per memorizzare una stringa di numeri e in seguito chiamato caratteri specifici e provato a utilizzare le operazioni int per trovare un prodotto. Quando ho usato una stringa di caratteri, ho ottenuto un prodotto ridicolmente grande, chiaramente errato. Anche se ho convertito quello che pensavo sarebbe stato compilato come un personaggio (str[n]) in un numero intero in linea ((int)str[n]), ha fatto esattamente la stessa cosa. Solo quando ho effettivamente utilizzato un array intero ha funzionato.

codice è il seguente

per la stringa di char

char str[21] = "73167176531330624919"; 

Ciò non ha funzionato. Ho ottenuto una risposta di circa 1.5 trilioni di dollari per una risposta che avrebbe dovuto essere di circa 40k.

per la int serie

int str[] = {7,3,1,6,7,1,7,6,5,3,1,3,3,0,6,2,4,9,1,9}; 

Questo è ciò che ha fatto il lavoro. Ho eliminato anche il casting in-line.

Ogni spiegazione sul motivo per cui queste cose funzionavano/non ha funzionato e tutto ciò che può portare ad una migliore comprensione di queste idee sarà apprezzato. Link a cose utili sono pure. Ho fatto ricerche su stringhe, array e puntatori molto da solo (sono autodidatta mentre sono al liceo) ma i concetti sono ancora confusi.

domanda laterale, sono stringhe in C memorizzato automaticamente come array o è solo possibile farlo?

+3

Forse [questa tabella] (http://www.asciitable.com) potrebbe far luce sul trattamento dei caratteri ascii come valori di "int". E sì, se per 'array' si intende una memoria contigua contenente i dati di carattere sottostanti, essi vengono memorizzati come tali (con un terminatore 0 implicito attaccato su). – WhozCraig

+0

la tabella dice che char '0' corrisponde ad un valore int di 48? – Charles

+0

Sì, anche se il valore è senza segno, che non può sembrare importante, ma sarà così se avete bisogno per gestire i caratteri ASCII estesi (vedere la tabella immediatamente inferiore a quella uno). Sei sulla strada giusta. Diverse risposte di seguito descrivono meglio questo. Si noti inoltre che questo ('0' == 48) è vero solo per ASCII. Esistono altri set di caratteri dipendenti dal sistema (come [EBCDIC] (http://en.wikipedia.org/wiki/EBCDIC)). – WhozCraig

risposta

4

Per approfondire risposta di WhozCraig, il problema si stanno avendo non hanno a che fare con le stringhe, ma con i singoli caratteri.

stringhe in C sono memorizzati in generale come array di caratteri (con l'avvertenza che esiste un terminatore null alla fine).

I caratteri stessi sono codificati in un sistema chiamato ASCII che assegna codici tra 0 - 127 per i caratteri utilizzati nella lingua inglese (solo). Così "7" non è memorizzato come 7 ma come la codifica ASCII di 7, che è 55.

penso che ora si può vedere perché il prodotto ha ottenuto così grande.

Un modo elegante per risolvere sarebbe quello di convertire

int num = (int) str[n]; 

a

int num = str[n] - '0'; 
//thanks for fixing, ' ' is used for characters, " " is used for strings 

Questa soluzione sottrae il codice ASCII 0 dal codice ASCII per il tuo personaggio, dire "7". Poiché i numeri sono codificati linearmente, questo funzionerà (per numeri a cifra singola).Per numeri più grandi, è necessario utilizzare atoi o strtol da stdlib.h

+0

Mi piace la tua idea di convertire il codice alle mie cifre che mi piacerebbe. È, come dici tu, elegante :) – Charles

+0

@ user2673602 Grazie, sono contento di poterti aiutare! –

+1

Vorrei suggerire [ 'strtol()'] (http://en.cppreference.com/w/c/string/byte/strtol) per le conversioni, ma l'idea c'è. – WhozCraig

3

Le stringhe sono solo matrici di caratteri con un byte di terminazione nullo. Non esiste un tipo di dati stringa separato in c.

Quando si utilizza un carattere come numero intero, viene utilizzato il valore numerico ASCII. Ad esempio, dicendo qualcosa come printf("%d\n", (int)'a'); comporterà 97 (il valore ASCII di 'a') in corso di stampa.

Non è possibile utilizzare una stringa di numeri per eseguire calcoli numerici a meno che non vengano convertiti in un array intero. Per convertire una cifra come personaggio nella sua forma intera, si può fare qualcosa di simile:

char a = '2'; 
int a_num = a - '0'; 
//a_num now stores integer 2 

Questo fa sì che il valore ASCII di '0' (48) per essere sottratto dal valore ASCII '2' (50) , infine, lasciando 2.

2
char str[21] = "73167176531330624919" 

questo codice è equivalente al

char str[21] = {'7','3','1','6','7','1','7','6','5',/ 
       '3','1','3','3','0','6','2','4','9','1','9'} 

quindi qualsiasi cosa memorizzata in str [21] non è numeri, ma il char (il loro equivalente ASCII rappresentazione è diverso).

risposta a domande a lato - sì/no, le stringhe vengono automaticamente memorizzate come array di caratteri, ma la stringa ha un carattere in più ('\ 0') come ultimo elemento (in cui un array di caratteri non deve avere tale).