[C] Stampare array di char e int
H questo problema in c: ho un array di char in cui vanno memorizzati valori esadecimali. Questo viene fatto attraverso una funzione in cui avviene un controllo sull'intervallo 0-F. Alla fine la funzione deve stampare il valore di ogni cella dell'array. Il problema viene qui: nell'array di char vengono memorizzati sia int che char, quindi nella printf devo inserire lo specificatore %c, ma in questo modo stameprei solo i char, mentre mettendo lo specificatore %d stampo solo gli int.
Cosa potrei fare affinchè la printf stampi una cosa del genere: AA654FF1 ?
Cosa potrei fare affinchè la printf stampi una cosa del genere: AA654FF1 ?
Risposte
Non mi è chiaro che cosa tu stia effettivamente facendo con quell'array. Stai dicendo che stai salvando i valori da 0 a 9 come i valori corrispondenti e i valori da 'A' a 'F' con il valore dei corrispondenti caratteri ASCII? Se hai bisogno di stamparli la cosa più semplice sarebbe usare i caratteri per tutti i valori e quindi salvare anche i numeri come i caratteri da '0' a '9' (cioè da 48 a 57) esattamente come fatto per i caratteri 'A' 'F'. In alternativa puoi salvare i valori nell'array usando numeri da 0 a 15, ma dovendoli poi stampare in modo più complicato. Insomma non ha granché senso usare un approccio intermedio come il tuo..
In pratica io dichiaro un array di char in cui devo memorizzare i caratteri compresi tra A e F, quindi i valori numerici corrispondenti sono 65-70 e deevo memorizzare i numeri da 0 a 9 pensati come caratteri, quindi con valori corrispondenti a 48-57. Il mio codice è questo:
Se nell'array inserisco solo numeri, non stampa nulla.
#include <stdio.h> int main() { char array[7]; printf("Inserisci valore per valore nell'array i valori nell'intervallo 0 - F"); for(int i = 0; i < 7; i++) { printf("\n Inserisci il %d valore", i+1); scanf("%c", &array[i]); getchar(); } for(int i = 0; i < 7; i++) printf("%c", array[i]); return 0; }
Se nell'array inserisco solo numeri, non stampa nulla.
Volendo restare nell'ambito dell'array non sarebbe più semplice qualcosa del genere?
Inoltre, premesso che ancora non ho capito bene cosa tu stia cercando di fare, ti faccio notare che esiste anche lo specificatore di formato [inline]%X[/inline] per i valori in esadecimale.
#include <stdio.h> int main() { char str[50]; scanf("%s", str); printf("%s\n", str); return 0; }
Inoltre, premesso che ancora non ho capito bene cosa tu stia cercando di fare, ti faccio notare che esiste anche lo specificatore di formato [inline]%X[/inline] per i valori in esadecimale.
Non posso usare le stringhe, devo trattare quell'array come un array di char e non come stringa.
Perché non spieghi bene cosa devi fare?!
In pratica, questa funzioalità mi serve per un progetto universitario, in cui è specificato che non vadano usate le stringhe. Quel vettore di char va trattato come tale, non pensandolo come stringa, quindi, per esempio la stampa dei suei elementi deve essre eseguita con un ciclo for e non con una printf specificando il formato "%s" stringa. Il problema che sorge è che inserendo in quel vettore dei numeri ch devo essere meorizzati come char, quando li vado a stampare, non vengono stampati, ma rimane dello spazio vuoto, come se venissero stampati invisibili.
Sinceramente non vedo motivi per cui il codice che hai postato non dovrebbe funzionare.
L'ho anche provato:
L'ho anche provato:
Inserisci valore per valore nell'array i valori nell'intervallo 0 - F Inserisci il 1 valore7 Inserisci il 2 valore6 Inserisci il 3 valore5 Inserisci il 4 valore4 Inserisci il 5 valore3 Inserisci il 6 valore2 Inserisci il 7 valore1 7654321 Process returned 0 (0x0) execution time : 8.881 s Press any key to continue.
In effetti, usando un compilatore online il codice funziona, ma non funziona sul mio. In realtà non mi stampa ne se metto solo lettere da A-F ne se metto lettere e numeri
Il programma che hai scritto è molto fragile e dipende molto da quello che viene inserito dall'utente e (credo) da come il terminale gestisce il comando di andare a capo. In ogni caso qualcosa dovrebbe venire stampato, come hai usato il tuo programma?
Sinceramente gestirei la lettura dei caratteri nel seguente modo:
Sinceramente gestirei la lettura dei caratteri nel seguente modo:
#include <stdbool.h> #include <stdio.h> #include <ctype.h> int main() { char numero[7]; // Legge 7 cifre e controlla che siano corrette printf("Inserisci il numero esadecimale di 7 cifre.\n"); for (int i = 0; i < 7; ++i) { int c = getchar(); if ((c < '0' || '9' < c) && (c < 'A' || 'F' < c) && (c < 'a' || 'f' < c)) { fprintf(stderr, "Cifra %d ('%c' 0x%x) non valida.", i + 1, c, c); return; } numero[i] = c; } // Stampa il numero letto printf("Numero inserito: "); for (int i = 0; i < 7; i++) putchar(numero[i]); putchar('\n'); }
Una piccola nota: [inline]if ((c < '0' || '9' < c) && (c < 'A' || 'F' < c) && (c < 'a' || 'f' < c))[/inline] è equivalente a [inline]if( isxdigit( (unsigned char)c ) )[/inline].
La condizione che ho scritto è uguale a [tt]!isxdigit(c)[/tt] (sto insomma testando se NON è una cifra esadecimale). Non vedo inoltre alcuna ragione per la presenza del cast: la funzione ha come argomento un [tt]int[/tt] che è esattamente il tipo della variabile [tt]c[/tt]. Il cast è consigliato nel caso in cui [tt]c[/tt] sia di tipo [tt]char[/tt] o [tt]signed char[/tt] ma non è questo il caso.
Grazie per l'aiuto!