"0" bei int nicht löschen
-
Hallo zusammen.
Habe eine kurze Frage
In meinen int soll z.B folgende Zahl
000150 // Die null sind dazu da, um anzuzeigen dass diese Felder leer sind.
Jetzt aber werden logischerweise die ersten 3 null gelöscht, da diese als überflüssig erscheinen.
Aber wie kann ich es dennoch machen, diese so in den int zu speichern?
Besten Dank
PS. Möglicherweise werden einige denken, ich soll doch etwas anderes anstatt "0" nehmen, aber ich will/muss dies mit "0", um dies vorweg geklärt zu haben.
-
Das hat nichts mit dem int an sich zu tun. Du musst einfach nur führende Nullen ausgeben, wenn du das int ausgibst. Wie das genau bei C++ geht, da bin ich überfragt, bei C wäre es %.4d wobei printf("%.4d\n", 4); dann 0004 ausgeben würde.
-
evtl. bist du dann mit einem char-array besser versorgt.
also intern ist der integer schon mit 0 gefüllt. nur du kannst jetzt nicht sagen auf der int-variable
if (int[0] = 0)
dann.....wenn du vergleichen willst, nimm die atoi funktion um das int zu char zu machen, dann kannst du die felder mit einer funktion von links auffüllen und ggf. dein vergleich machen
-
Gibt es denn keine Variante, die mit int so zu lösen ist?
Ich möchte am liebsten auf Umwandlungen verzichten..
Besten Dank
-
std::cout.fill( '0' ); std::cout.width( 6 ); std::cout << std::right << 125 << std::endl;
oder
std::stringstream ss; ss.fill( '0' ); ss.width( 6 ); ss << std::right << 125; std::cout << ss.str() << std::endl;
-
sag uns zuerst, ob 000150 und 00150 verschiedene werte sind oder ob es hier in diesem programm immer nur sechstellige werte geben kann.
-
Als mein Programm soll ein Sudoku lösen.
Ich habe das Soduko so in meinem .txt file:000150
100020
002030
040600
020005
065000Dieses file habe ich mittels getline in einen std::string eingelesen und diesen dann mit sstr >> Zahl; in einen int umgewandelt.
Die null beteuten = leer.
Ist dies verständlich genug?
Sonst nur fragen.Besten Dank
-
warum willst du unbedingt int haben? Das wäre über einen String bei weitem einfacher in der späteren Verarbeitung
mittels str[index] ziehst du dir die einzelnen Zeichen raus, wandelst diese dann in ein int um (
'x' - '0'
ergibt x) und kannst wunderbar weiterarbeiten
-
also ich sag auch char/string ist hier die besser methode.
du musst die werte ja nich tzwangsläufig so einlesen 0001090, ___1090 tuts doch uch? lässt sich ohne ints deutlich leichter machen.
zudem, wenn du die einliest castest du ja einen charwert in einen int, was dann ja jetzt wegfallen würde. und das ganze schneller macht.
-
Vor allem wirst du ja kaum eine ganze Zeile als Ganzzahl interpretieren wollen. Im Sudoku geht es um die einzelnen Ziffern, und da bist du mit
std::string
definitiv besser beraten.Wie von zwutz angedeutet kannst du per Indexoperator oder
at()
auf die einzelnen Zahlen zugreifen und diese mit einemstd::stringstream
umwandeln.
-
feigling schrieb:
Das hat nichts mit dem int an sich zu tun. Du musst einfach nur führende Nullen ausgeben, wenn du das int ausgibst. Wie das genau bei C++ geht, da bin ich überfragt, bei C wäre es %.4d wobei printf("%.4d\n", 4); dann 0004 ausgeben würde.
Das ist doch ganz einfach:
int i = 4; cout << 000 << 4;
-
Ups, meine natürlich
int i = 4; cout << 000 << i;
-
Hakan B. schrieb:
Ups, meine natürlich
int i = 4; cout << 000 << i;
wie man es richtig macht, steht auf Seite 1, aber danke, dass du zeigst, wie man es nicht machen sollte
-
Wieso, was ist denn an meiner Variante falsch?
-
zwutz wie meinst du denn genau?
Also zeilenweise auslesen und jede Zeile in einen String-Container ablagern?
Ich begreife noch nicht ganz, wann du dann in int umwandelst und ob diese int Wert dann auch im Container sind.
Meine Funktion ist so:void ZeilenEinlesen(CIntContainer* pSudokuZahlenContainer, std::string FileNameMitEndung,) { std::string Zeile; int Zahl; ifstream File(FileNameMitEndung.c_str()); while (std::getline(File, Zeile)) { std::stringstream sstr(Zeile); sstr >> Zahl; ZeilenZaehler++; pSudokuZahlenContainer->push_back(Zahl); } File.close(); }
Und ja, du hast recht, jetzt habe ich eine ganze Zahl pro Zeile und das ist nicht das was ich will.
Aber wie wäre deine Variante gedacht mit meinem Code?
Ist dies möglich, damit ich dann auch einen int Container habe, aber jede Zahl einzeln "ansprechbar"?
Besten Dank
-
integer000150 schrieb:
....Die null sind dazu da, um anzuzeigen dass diese Felder leer sind....
Also mir scheint es eher, dass Du "eine Ecke zu früh abgebogen" bist.... offensichtlich möchtest Du einen Satz von Feldern beschreiben, die gesetzt oder ungesetzt sein können und wenn sie gesetzt sind, Werte zwischen 1 und 9 annehmen können.
Warum das nicht einfach in Quellcode gießen?
class Feld { bool isSet; unsigned int val; public: Feld() : isSet(false) {} Feld(Feld const& f) : isSet(f.isSet), val(f.val) {} // für's Kopieren void setVal(unsigned int v) { if(v == 0 || v>9) throw runtime_error("invalid val"); isSet = true; val = v; } unsigned int getVal()const { if(!isSet) throw runtime_error("not set"); return val; } char showVal() const { static const char i2a[] = "0123456789"; if(!isSet) return 'X'; return i2a[val]; } };
Wenn Du mehrere davon brauchst, kannst Du sie z.B. in einem std::vector, einem Array oder sonstwo ablegen....
Gruß,
Simon2.