2016-09-26 1 views
-1

Ich möchte jede Ziffer einer ganzen Zahl in ein Zeichen umwandeln und führende Nullen bei Bedarf hinzufügen.Konvertiere jede Ziffer einer ganzen Zahl in ein Zeichen mit C

char arr[4]; 
int i = 5; 

Ich möchte diesen Wert speichern und haben das Array aussehen, 0005. Ebenso, wenn i = 43 Ich möchte das Array gleich 0043.

Weiß jemand, wie ich das erreichen kann?

+0

Möchten Sie das wirklich tun, oder wollen Sie nur die Daten so anzeigen? Die 'printf'-Familienfunktionen können führende Nullen für Sie hinzufügen. – yano

+0

Wie möchten Sie die Größe des Arrays steuern, das das Ergebnis liefert? Weiß der Code, dass das Array groß genug ist? Oder sollte Code mit Werten wie -9999 und 1000000000 umgehen? – chux

+5

Möchten Sie ein 4 'char' Array oder eine Zeichenfolge? – chux

Antwort

10

Sie können nur sprintf verwenden:

char arr[5]; 
int i = 5; 
sprintf(arr, "%04d", i); 

Beachten Sie, dass dieser Code möglicherweise nicht sicher ist, wie Sie nur zu 4 Zeichen in arr speichern können, so dass ein Wert von> 9999 wird in undefiniertem Verhalten führen. Idealerweise sollte arr groß genug sein, um die Darstellung des größtmöglichen (positiven oder negativen) Werts, z. B. , zu halten. char arr[16];


Hinweis: Wenn Sie wirklich kein Abschluss '\0' Charakter aus irgendeinem Grund (zB willkürliche Hausaufgaben Problem Constraint), dann könnten Sie eine einfache Schleife schreiben kann:

for (int k = 3; k >= 0; --k) 
{ 
    arr[k] = i % 10 + '0'; 
    i /= 10; 
} 
+0

Ich möchte die Werte zwar speichern, aber nicht drucken. – Nic

+2

'sprintf' druckt nicht wirklich. Das Präfix 's' steht für' string': Es rendert den Text in Zeichen an einer Speicheradresse – slezica

+2

'sprintf' speichert die Werte in 'arr', druckt sie nicht. – GrahamS

0

Wenn Sie nicht verwenden möchten snprintf, können Sie so etwas wie die folgenden tun:

char arr[4]; 
unsigned int i = 49; 

for (char *out = arr + sizeof(arr) - 1; out >= arr; i /= 10) 
    *out-- = '0' + i % 10; 

, dass das gesamte Array mit Nullen vor der Zahl füllen würde, ich denke, das ist, was Sie wollten.

Funktioniert jedoch nicht für negative Zahlen. Brauchst du das?

+1

Problem mit 'out> = arr' ist, dass die folgenden 'out - 'ist UB wenn out == arr. Vorschlagen 'für (char * out = arr + Größevon (arr); out> arr; i/= 10) * (- out) = '0' + i% 10;' und versichern 'i> = 0'. – chux

+0

Das ist eine wirklich obskure Art, diese Schleife auszudrücken! – GrahamS

+0

@chux Erstens, der Grund dafür, dass es so implementiert wird, ist, dass es optimalen Code in x86 und anderen Architekturen generiert, wo die Speicherung und die Zeigermanipulation kombiniert werden können. Und zweitens gibt es kein UB. –

Verwandte Themen