PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C Format Problem



gigu
11.03.2010, 12:11
Hallo
Ich würde gerne in C eine Zahl mit vorne anghängten nullen ausgeben.
die nullen müssen varieren, da sie vom benutzer eingegeben werden. Das heisst also das die nullen auch mit eingelesen werden müssen und man sie nicht nur bei beim printf anhängen kann.

z.B. so:

int x=001;
printf("%d",x);


x kann nacher der Benutzer selbst defieneren sieht etwa so aus: 01, 001, 0001, 00001,000001 etc...

Jetzt ist allerdings das Problem das die Nullen bei der Ausgabe immer weggelassen werden.
Kennt jemand so ein flag oder ein bestimmtes formatelement mit dem die nullen mitgespeichert oder nicht weggelassen werden?

vielen dank

GregorSamsa
11.03.2010, 12:40
So einfach geht das nicht.
C Interpretiert eine 0001 wie eine 1 - das heißt, dass eventuell vorhandene Nullen automatisch abgeschnitten werden.
Du kannst die Länge der Ausgabe einstellen, dann würde die vorne mit 0'en aufgefüllt.
Alternativ müsstest du mit Strings arbeiten.

blackberry
11.03.2010, 13:16
Du kannst bei printf angeben, wieviele Zeichen etwas haben soll.
Dies gilt auch für Integer.
Dabei kannst du auch angeben, wie diese Zeichen aufgefüllt werden sollen (falls dein Integer nicht soviele Stellen hat).

Dies Funktioniert so: %05d das 05 Steht dabei für: 5 Stellen sollen angezeigt werden und nicht besetzte Stellen sollen mit 0en aufgefüllt werden.

Willst du die Anzahl der Stellen variieren musst du das erste Argument für printf anpassen bzw. vom Programm generieren lassen.
Das sähe ungefähr so aus:

#include <stdio.h>


int main(void)
{
int i = 123;
int n = 5;
/*
sizeof(buffer) = (in pseudocode)
strlen( %.0d ) + // 4
strlen( to_str(0x7FFFFFFF) ) + // 10
1 // Nullbyte
*/
char buffer[15];

// i, n einlesen

if (n <= 0)
{
// Fehler...
}
else
{
sprintf(buffer, "%%.0%dd\n", n);
printf(buffer, i);
puts(buffer);
}

return 0;
}Ausgabe:

blackberry:~/Development$ gcc -o str str.c; ./str
00123
%.05d

P.S.: wenn du sowas wie int i = 00123; verwendest, dann sorgt die erste Null dafür, dass die Zahl vom Compiler als Oktalzahl (zur Basis 8) interpretiert wird. Das sorgt dann für unerwartete Ergebnisse, wenn du davon ausgehst, dass 00123 auch 123 im Dezimalsystem ist (was nicht der Fall ist; das wäre nämlich 83 dezimal).


MfG. BlackBerry

DoS
11.03.2010, 15:52
#include <iostream>

using namespace std;

int main()
{
char data[20]; // Deklaration des Char Arrays

cin.get(data,19); // 1 weniger, da noch die Escape Sequenz dazu kommt

cout<<data; // ausgeben

return 0;
}Also hier ebenfalls wieder mit Char gelöst :)

Eigentlich wollte ich gerade noch eine andere Möglichkeit (Spielerei mit EOF) beschreiben, aber nachdem ich eine halbe Stunde ausprobiert habe, mit dem Ergebnis, dass sie nicht funktioniert, schreibe ich sie nicht mehr ;) (was ein Satz) .


Edit: Noch ne blöde Idee: Einfach die Zahl in ein int-Array speichern. Allerdings in den "ASCII Werten". Jede Stelle hat also einen Index. In diesem Index steht dann die entsprechende ASCII Zahl , die die Stelle darstellt.

Bei 01 steht dann da also Folgendes:

data[0] = 48;
data[1] = 49;

Dann musst du später die verschiedenen "Array-Indexe" nacheinander ausgeben.
Aber so natürlich, dass das ASCII Zeichen dargestellt wird. Also: cout<<(char)data[index];

Ich hoffe, dass dir meine zweite sinnvolle (sinnvoll deswegen, weil ich schon gerade mehrere Unsinnige hatte :D ) Idee helfen kann :) .


Gruß -DoS

P.S. Ja ja, C++ Stil ich weiß... xD