Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (GNU/Linux, *NIX, *BSD und Co) » std::string zu unsigned int

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
19.11.2010, 12:10 Uhr
Regina



wie kann ich eine Zahl stellenweise bestimmen? also dass ich nicht gleich sage, dass zB int Zahl = 12642, sondern dass die einzelnen Stellen nach bestimmten Kriterien verändert werden. Ich habs versucht, indem ich die Zahlen in ein std::string Zahl, und dann zB Zahl[3]=...eingegeben habe. Das Problem ist nur, dass die Ausgabe unbedingt ein int, bzw unsigned int sein muss. Kann man das irgendwie von std::string zu int konvertieren? Oder gibt es eine elegantere Möglichkeit (es muss zum Schluss aber ein int sein)?

Wie man bestimmt sieht, hab ich so gut wie keine Ahnung vom Programmieren...Danke schonmal
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
19.11.2010, 13:48 Uhr
ao

(Operator)


Prinzipiell geht das mit std::string, allerdings muss man dran denken, dass die einzelnen "Ziffern" als char behandelt werden müssen und nicht als int, d.h. man muss noch mal umrechnen zwischen '0' und 0.

Dann: In der String-Darstellung ist Zahl[0] die höchstwertige Stelle und nicht (wie mancher spontan annehmen würde) die Einerstelle. Mit sowas holt man sich leicht einen Knoten im Hirn.

Und zu guter Letzt ist es ziemlich mit Kanonen auf Spatzen geschossen, wenn man hierfür die stringstream-Bibliothek hernehmen will.


Mein Vorschlag: Zerlege die Zahl in ein Array (*) von unsigned int und speichere in arr[0] die Einerstelle, in arr[1] die Zehner, in arr[2] die Hunderter und so weiter. Du bekommst die Werte durch fortgesetzte Restdivision (modulo, %-operator) durch 10 (alternativ: durch jede beliebige Basis).

Mit den Array-Elementen kannst du machen, was du willst, und am Ende baust du die Zahl wieder zusammen, indem du jede Stelle mit ihrem Stellengewicht malnimmst und aufaddierst.

Um das ganze einen class-Wrapper schreiben und fertig.

(*) Natürlich nimmst du kein nacktes unsigned int [] dafür, sondern einen passenden STL-Container.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
19.11.2010, 17:18 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


warum nicht einfach zum umwandeln?


C++:
std::string zahlalstext = "-1244543"
std::stringstream converter(zahlalstext);

int zahlalszahl;
if(! (converter >> zahlalszahl) )
  std::cout << "oops da war keine zahl dringestanden" << std::endl;

if(zahlalszahl == -1244543)
  std::cout << "jup, hat funktioniert" << std::endl;



ansonsten, könntest du die jeweiligen stellen der zahl über binäres und ( & ) "herausziehen", und dann mit binärem oder ( | ) wieder hinzufügen, bzw einfacher wohl mit - und + ;-)
--
class God : public ChuckNorris { };

Dieser Post wurde am 19.11.2010 um 17:21 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
21.11.2010, 12:14 Uhr
Regina



@ao:

Wenn ich es im Array speicher, kann man es dann mit atoi(...) rausholen, oder ist das was anderes?


@FloSoft:

Kannst du mir sagen, was das Ausrufezeichen und >> in " ! (converter >> zahlalszahl)" bewirkt?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
22.11.2010, 03:46 Uhr
Hans
Library Walker
(Operator)


Hi,

mit atoi kannst Du auch hantieren. Dabei sind aber die Wertigkeiten der einzelnen Stellen zu beachten. D.h. Du kannst die einzelnen Ziffern aus dem array nicht einfach nach int umwandeln und zusammenzählen. Stattdessen wandelst Du zuerst die höchste Stelle um, und multiplizierst das Ergebnis mit 10. Dann die nächste Stelle umwandeln, addieren und das Ergebnis wieder mit zehn multiplizieren. Das machst Du so lange, bis Du bei der einer Stelle angekommen bist. Die brauchst Du nur noch zu addieren, aber nichts mehr multiplizieren.

Hans


Bearbeitung von Hans:
Ersten Satz durchgestrichen, weil falsch. (siehe unten). Wenn aber ein Zugriff auf die einzelnen Stelle gegeben ist, stimmt der Rest.

--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.

Dieser Post wurde am 22.11.2010 um 16:52 Uhr von Hans editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
22.11.2010, 08:53 Uhr
ao

(Operator)



Zitat:
ansonsten, könntest du die jeweiligen stellen der zahl über binäres und ( & ) "herausziehen", und dann mit binärem oder ( | ) wieder hinzufügen,


... aber nur im Dualsystem. Es geht doch um die Stellen im Zehnersystem, also zum Beispiel die Zahl 487 zerlegen in 4 | 8 | 7, um dann die einzelnen Ziffern irgendwie zu verändern, oder?


Zitat:
Wenn ich es im Array speicher, kann man es dann mit atoi(...) rausholen, oder ist das was anderes?

Das ist was anderes. Das macht dir aus einer String-Darstellung (z.B. "1583") den numerischen Wert 1583. Der Name atoi (array to integer) kommt daher, dass eine Zeichenkette in C als Array von Zeichen gespeichert wird.

atoi gibt keinen Zugriff auf die einzelnen Ziffern.

Leute, ihr habt recht, man kann die Aufgabe auf viele Arten lösen, aber manche davon sind echte Krücken mit lästigen Nebenwirkungen. Man kommt nur dann zu sauberen und verständlichen Lösungen, wenn man passende Datentypen wählt, und der passende Datentyp für dieses Problem ist meiner Meinung nach ein Array von integer (*), in dem jedes Element eine Ziffer enthält (wie oben beschrieben).

Vor allem dann, wenn als nächstes die Aufgabe kommt, zwei solcher Zahlen zu addieren.

(*) ob signed oder unsigned int, das hängt davon ab, wie man negative Zahlen darstellen will. Hab ich noch nicht drüber nachgedacht, aber spätestens dann, wenn man Rechenoperationen definiert, muss man das tun.

Dieser Post wurde am 22.11.2010 um 08:54 Uhr von ao editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
22.11.2010, 16:48 Uhr
Hans
Library Walker
(Operator)



Zitat von ao:
Der Name atoi (array to integer)

ups! - Ich bin bisher immer von "ASCII to Integer" ausgegangen.


Zitat von ao:
atoi gibt keinen Zugriff auf die einzelnen Ziffern.

Stimmt. - Hab ich gerade auch feststellen müssen...

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (GNU/Linux, *NIX, *BSD und Co) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: