Einzelne Zeichen eines Strings in Int umwandeln
-
Hallo,
ich habe ein erschreckend simples Problem:
Ich schreibe ein Sudokuprogramm, und das besitzt eine Ladefunktion, der das ganze Sudoku ohne Zeilenumbrüchen und die Leerfelder als beliebiges Zeichen übergeben werden. Ein Sudoku sieht dann ein Sudoku bspw. so aus:
1xxxxxxxxxx6xxxxxxx3x1xxxxx76x2xx853xx143x27628xx5x1xxxx5x1x3x23xxx4xx8x6xx87xxxxIn der Funktion muss also jedes Zeichen nach Integer umwandeln. Dafür habe ich diesen Code mit der Funktion atoi() programmiert:
bool classes::CSudoku::Laden(string sudoku) { //Lesepuffer füllen const char* buffer = sudoku.c_str(); //Jedes Zeichen einlesen for(int counter = 0; counter < 81; counter++) { //Der passende Punkt im Array berechnen structs::Point Punkt = { counter % 9, counter / 9}; //Zahl umwandeln int value = atoi(&buffer[counter]); //Zahl überprüfen if(value <= 9 && value >= 0) { //... und zuweisen Felder[Punkt.y][Punkt.x].Value = value; } else { return false; } } }
Das klappt auch ganz schön, bis zwei Zahlen hintereinander stehen; in diesem Fall die 76. Dort wandelt atoi nämlich nicht nur die 7 um, sondern auch die 6 direkt mit. Somit gibt die Funktion false zurück.
Nun die daraus resultierende Frage:
Wie schaffe ich es, das nur immer ein Zeichen umgewandelt wird?Nur am Rande: Die Möglichkeit, dass ich direkt ein Zeichen aus dem String verwende, hab ich auch schon probiert, funktioniert aber auch nicht...
-
zB so:
string text; // aus datei laden for(int i = 0; i < text.size(); i++) { // Punkt punkt berechnen char c = text[i]; if(c >= '0' && c <= '9') ZahlSetzen(punkt, c - '0'); else SetzeLeerStelle(punkt); }
-
Danke, klappt jetzt super!
-
Bei der Umwandlung eines einzelnen Character-Zeichens nach Integer geht das direkt über den zugehörigen Integer-ASCCI-Code ohne die Funktion atoi(). Das ist deutlich schneller und macht keine Probleme.
-
In C++ würde ich generell wenige C-Funktionen wie
atoi()
einsetzen und dafür die entsprechenden Stream-Klassen der C++-Standardbibliothek benutzen.