PDA

Visualizza la versione completa : [c/c++]Convertire intero in stringa


m4st3r
12-12-2008, 19:46
#include <iostream.h>
#include <stdlib.h>
#include <time.h>

void ora(int &h,int &min,int &sec,int &gm,int &m,int &a)
{ time_t tempo;
struct tm * leggibile = NULL ;

time(&tempo);
leggibile = localtime(&tempo);

h = leggibile -> tm_hour;
min = leggibile -> tm_min;
sec = leggibile -> tm_sec;
gm = leggibile -> tm_mday;
m = leggibile -> tm_mon + 1 ;
a = leggibile -> tm_year + 1900 ;

}

int main ()
{ int h,min,sec,gm,m,a;

ora(h,min,sec,gm,m,a);

cout << "Sono le ore "<< h <<":"<<min<<" e "<<sec<<" secondi"<<endl;
cout << "Data "<<gm<<"/"<<m<<"/"<<a<<endl ;
system("pause");
return 0;
}


--------------------------------------------------------------------------------------

attraverso questa funzione riesco a ottenere ora e data dal sistema che vengono salvati in delle variabili intere...

ora vi spiego il mio problema:
x scuola devo amministrare un parcheggio che a ogni macchina che entra venga attribuito un tagliando e segnalata l'ora e data di ingresso e uscita...

ora: ho pensato di risolvere questo problema con le liste dinamine non sapendo a priori il numero di tagliandi emessi

quindi ho pensato di fare una variabile
typedef struct tagliando
{ int numero;
ora ingresso;
ore uscita;
data;
tagliando *next;
}


l'unico problema è che le variabili ora ingresso uscita vorrei salvarle nel formato CHAR 24:22 (hh:mm) e 12/12/2008 (gg/mm/aaaa) dato che se no avrei troppe varibili da gestire nel formato INT...(tanto poi non ci devo fare sopra nessuna operazione)

la mia domanda è quindi: COME CONVERTIRE UN INT IN CHAR?

es io ho

int h = 10
int min = 7

e vorrei fare 10:07 (il 7 diventa 07)
stessa cosa per la data....è possibile?

grazie mille a tutti
ciao ciao
by Nick

m4st3r
12-12-2008, 19:48
ah mi son dimenticato di dire che NON abbiamo fatto ancora ne gli OGGETTI ne le CLASSI....
grazie a tutti per la disponibilita

Xaratroom
12-12-2008, 19:59
prima di tutto, quando posti del codice, per migliorare la leggibilità, usa i tag code:
[*code]codice[/*code]
(senza asterisco)

Hai mai provato ad usare la funzione asctime ?


#include <stdio.h>
#include <time.h>

int main ()
{
time_t rawtime;
struct tm * timeinfo;

time ( &rawtime );
timeinfo = localtime ( &rawtime );
printf ( "The current date/time is: %s", asctime (timeinfo) );

return 0;
}

Per la conversione di un intero in stringa potresti usare uno stringstream (contenuta nell'header "sstream") oppure sprintf (contenuta nell'header "stdio")


char stringa[10];
int ore, minuti;
...
sprintf(stringa,"%d:%d", ore, minuti);

Xaratroom
12-12-2008, 20:11
ah scusa, nel tuo caso:


sprintf(stringa,"%02d:%02d", ora, minuti);

m4st3r
12-12-2008, 20:50
grazie gentilissimo!!
dopo provo subito quello che mi hai detto...scusami ma sono alle prime armi :)

riguardo sprintf(stringa,"%d:%d", ore, minuti);
ho capito che il primo è la destinazione
ma il parametro in mezzo "%d:%d" vorrei capire cosa significhino o magari se puoi linkarmi una guida dove spieghi come si utilizza la funzione sprintf che io nn l'ho trovata...grazie mille!

oregon
12-12-2008, 20:53
sprintf
http://www.cplusplus.com/reference/clibrary/cstdio/sprintf.html

Xaratroom
12-12-2008, 21:25
chiedo scusa per l'imprecisione

m4st3r
13-12-2008, 11:16
grazie mille per l'aiuto!

allora dalla guida ho capito che "%02d:%02d" è la stringa di formattazione, ma alcune cose non mi sono ancora chiare

" " a cosa servono? a dire che : è un carattere e non un parametro?

% indica l'inizio di una direttiva di conversione

d L'argomento e' convertito a decimale segnato...cioè? che dopo ci saranno dei numeri?

02 non l'ho capito :)...è quello che fa diventare ad es 7 in 07?

e poi perche %02d è ripetuto sia prima che dopo il ':'?

se riuscite a farmi un po' di chiarezza :)
grazie mille

m4st3r
13-12-2008, 11:17
Originariamente inviato da Xaratroom
chiedo scusa per l'imprecisione

ma figurati! sono io che t devo ringraziare!

Xaratroom
13-12-2008, 13:16
allora dalla guida ho capito che "%02d:%02d" è la stringa di formattazione, ma alcune cose non mi sono ancora chiare
" " a cosa servono? a dire che : è un carattere e non un parametro?
% indica l'inizio di una direttiva di conversione
d L'argomento e' convertito a decimale segnato...cioè? che dopo ci saranno dei numeri?
02 non l'ho capito ...è quello che fa diventare ad es 7 in 07?
e poi perche %02d è ripetuto sia prima che dopo il ':'?

Il prototipo della sprintf è il seguente:


int sprintf ( char * str, const char * format, ... );

Ritorna un valore int che equivale, in caso di successo, al numero di caratteri scritti.
Richiede:
-Un parametro di tipo puntatore a carattere (char *str), che rappresenta la stringa, sulla quale andrà a scrivere.
-Un parametro di tipo puntatore a carattere costante (const char * format), che è appunto la stringa di formattazione.
-Altri parametri "non determinati" (...)
Per "poter capire" quello che viene effettivamente passato, la sprintf ha bisogno che, il tipo dei dati passati (dopo la stringa di formattazione) sia specificato nella stringa di formattazione.
Per specificare che tipi stai passando, alla funzione, utilizzi le direttive di conversione.
Il carattere % indica l'inizio di una direttiva di conversione.
Mentre il carattere che lo segue, solitamente, il tipo della variabile passata.
Per capirci meglio:


[...]
char nome[20];
int i;
[...]
char stringa[30];
sprintf (stringa, "Salve utente numero %d, il tuo nome è %s", i, nome);

Notare la prima direttiva di conversione (%d) si riferisce al terzo parametro passato alla funzione (la variabile i : d -> intero) mentre la seconda direttiva (%s) si riferisce al quarto parametro (nome: %s ->stinga).
Detto questo c'è da fare l'ultima precisazione:
%d è una direttiva di conversione senza alcun flag opzionale.
La struttura di una direttiva di conversione è la seguente:


% Obbligatorio Indica l'inizio di una direttiva di conversione.
- Flag opzionale Specifica un incolonnamento a sinistra.
+ Flag opzionale Specifica che il segno verra' sempre stampato.
' ' (spazio) Flag opzionale Specifica che verra' stampato o il segno negativo o uno spazio.
0 Flag opzionale Specifica che nelle conversioni numeriche, i caratteri di riempimento saranno 0 (zeri) anziche' spazi.
# Flag opzionale Specifica un formato alternativo per l'output.
Ampiezza Numero opzionale Dimensione minima del campo.
'.' (punto) Opzionale Separa l'ampiezza dalla precisione.
Precisione Numero opzionale
Modificatore Lettera opzionale La lettera h seguita da uno dei caratteri di conversione d, i, u, o, x o X indica che l'argomento e' uno short int o uno unsigned short int.
Il modificatore l (elle) con gli stessi caratteri di conversione, indica che l'argomento e' un long int o uno unsigned long int.
Il modificatore L seguito da uno dei caratteri di conversione e, E, f, g o G indica che l'argomento e' un long double.
Carattere di conversione Lettera obbligatoria Termina la specifica di conversione relativa ad un argomento della lista variabile.

Quindi, (in %02d) 0 specifica che i caratteri di riempimento saranno degli 0 e non degli spazi, mentre 2 indica che la dimensione minima del valore "stampato" sarà di 2 cifre.
%indica l'inizio e d indica la fine.

La stringa di formattazione per il tuo caso diventa:
"<primo>:<secondo>"
(quindi nella stringa di formattazione ci sono 2 direttive).
dove <primo> e <secondo> sono entrambi uguali alla direttiva %02d

spero di non essere stato confusionario

Loading