# C++ Int zerlegen



## Shadow1911 (22. August 2010)

Hallo,
ich habe mit C++ angefangen und wollte wissen wie man eine beliebige Integer Variable z.B. 123456 in einzelner chars zerlegt.
Also will ich aus
zahl = 123456

teil1 = 1
teil2 = 2
teil3 = 3
teil4 = 4
teil5 = 5
teil6 = 6

Danke schonmal im Vorraus


----------



## sheel (22. August 2010)

Kennst du dich mit Arrays schon aus?


```
int zahl;
...
char einzeln[12];
sprintf(einzeln,"%d",zahl);
```

sprintf funktioniert wie printf, es schreibt aber nicht auf den Bildschirm, sondern in char-Array.


----------



## Shadow1911 (22. August 2010)

sheel hat gesagt.:


> Kennst du dich mit Arrays schon aus?
> 
> 
> ```
> ...


 
Dankeschön.
Mit Array hab ich mich noch nicht beschäftigt, weil ich die noch nie genutzt (und gebraucht) habe.


----------



## sheel (22. August 2010)

einzeln[0] ist die erste Stelle,
einzeln[1] die zweite,
einzeln[2] die dritte usw.

Die Anzahl der Stellen bekommst du in dem Fall mit strlen(einzeln)


----------



## MCoder (22. August 2010)

Die modernere (C++ like) Variante wäre die Verwendung eines Stringstreams.

```
#include <sstream>

int zahl = 123456;

std::stringstream sstr;
sstr << zahl;
// sstr.str().size() liefert die Anzahl der Ziffern
// sstr.str()[0] enthaelt die 1
// sstr.str()[1] enthaelt die 2
// usw.
```
Gruß
MCoder


----------



## Shadow1911 (23. August 2010)

MCoder hat gesagt.:


> Die modernere (C++ like) Variante wäre die Verwendung eines Stringstreams.
> 
> ```
> #include <sstream>
> ...



Danke =)
Ich glaube das ist die Variante die ich brauche.


----------



## Shadow1911 (23. August 2010)

Gibt es auch eine Möglichkeit einen solchen String zu erstellen und zu belegen?
z.B.

```
#include <sstream>
using namespace std;
.
.
.
stringstream sstr;
sstr.str()[0] = 1
sstr.str()[0] = 2
...
```


----------



## Shadow1911 (23. August 2010)

bzw. wie deklariere ich die einzellnen Teile des Strings?


----------



## sheel (23. August 2010)

Willst du das Ganze umgekehrt machen oder was meinst du?


----------



## Shadow1911 (23. August 2010)

Ich brauche beides.
Den 1. Teilw ie ich eine Zahl splitte habe ich jetzt verstanden.
Jetzt will ich einen String erstellen und ihm manuell die Werte zuweißen und dann in eine Variable packen.


----------



## MCoder (23. August 2010)

Shadow1911 hat gesagt.:


> Gibt es auch eine Möglichkeit einen solchen String zu erstellen und zu belegen?


Äh, ich würde sagen, du meinst eine einfache Zuweisung?

```
std::string str = "123456";
```
Ansonsten wäre ein simples char-Array die einfachste Lösung.

```
char buffer[7];
buffer[0] = '1';
buffer[1] = '2';
// usw.
buffer[6] = '\0'; // Kennzeichen für Stringende
```
Gruß
MCoder


----------



## sheel (23. August 2010)

Muss es unbedingt über einen String sein?
Woher kommen die Werte?


----------



## Shadow 1911 (23. August 2010)

Also ich will als Endergebnis haben das mein ursprünglicher String mit
Wert1
Wert2
Wert3
Wert4
Wert5
Wert6
am Ende umgedreht ist. Also:
Wert6
Wert5
Wert4
Wert3
Wert2
Wert1
aber trotzdem als String und mit einer UNBESTIMMTEN Zahlenanzahl.
Wie das am Ende passiert ist mir eigendlich relativ egal.
Bisher schonmal ein Danke an alle die mir versuchen zu helfen.


----------



## MCoder (23. August 2010)

Reihenfolge umkehren:

```
std::string str ="123456";
std::reverse(str.begin(), str.end());
```
Gruß
MCoder


----------



## Shadow1911 (24. August 2010)

Danke.
Eine Frage wäre da noch. Wie zerlege ich einen String in einzellne chars?
ich habe bis jetzt

```
//Auszug:
	char p10=string1.substr (10,10);
	char p11=string1.substr (11,11);
	char p12=string1.substr (12,12);
	char p13=string1.substr (13,13);
	char p14=string1.substr (14,14);
	char p15=string1.substr (15,15);
```
Da kommt aber immer die Fehlermeldung:


> IntelliSense: Es ist keine passende Konvertierungsfunktion von ""std::basic_string<char, std::char_traits<char>, std::allocator<char>>"" in ""char"" vorhanden.


----------



## sheel (24. August 2010)

```
char c0=string1.c_str()[0];
char c1=string1.c_str()[1];
char c2=string1.c_str()[2];
```

Mit substr kriegst du nur wieder einen String. Es können ja auch mehrere Zeichen (zB 10 bis 18) gefragt sein.


----------



## MCoder (24. August 2010)

'substr' liefert den Datentyp 'string'; du müsstest also auf 'char' casten.  Weniger umständlich ist allerdings der Zugriff über den Index:

```
char p1  = string1[0];
//...
char p10 = string1[9]; 
char p11 = string1[10]; 
// usw.
```
Gruß
MCoder

//EDIT: Casten ist hier Blödsinn


----------



## Shadow1911 (24. August 2010)

Add:
Ich benutze MS Visual C++ Studio 2010 Express


----------



## Shadow1911 (24. August 2010)

Jetzt kommt das nächste Problem was vorher nicht da war -.-

```
cin >> binar;
	string string2 (binar);
	string::reverse_iterator rit;
	//
	char p0=string2.c_str()[0]; 
	char p1=string2.c_str()[1];
	char p2=string2.c_str()[2];
	char p3=string2.c_str()[3];
	char p4=string2.c_str()[4];
	char p5=string2.c_str()[5];
	char p6=string2.c_str()[6];
	char p7=string2.c_str()[7];
	char p8=string2.c_str()[8];
	char p9=string2.c_str()[9];
	char p10=string2.c_str()[10];
```

Fehler


> Fehler	1	error C2664: 'std::basic_string<_Elem,_Traits,_Ax>::basic_string(const std::basic_string<_Elem,_Traits,_Ax> &)': Konvertierung des Parameters 1 von 'int' in 'const std::basic_string<_Elem,_Traits,_Ax> &' nicht möglich


----------



## MCoder (25. August 2010)

Shadow1911 hat gesagt.:


> Jetzt kommt das nächste Problem was vorher nicht da war -.-


In welcher Zeile tritt der Fehler auf und was ist 'binar' (Datentyp)? Das 'c_str()' ist übrigens  entbehrlich - die Klasse string hat einen operator [] definiert, der das Zeichen (char) an der angegebenen Position liefert.

Gruß
MCoder


----------



## Shadow1911 (25. August 2010)

MCoder hat gesagt.:


> In welcher Zeile tritt der Fehler auf und was ist 'binar' (Datentyp)? Das 'c_str()' ist übrigens  entbehrlich - die Klasse string hat einen operator [] definiert, der das Zeichen (char) an der angegebenen Position liefert.
> 
> Gruß
> MCoder


 
Binar = int

Der Fehler tritt an der Stelle auf an der ich dem 'String2' die Variable 'Binar' zuweißen will.


----------



## MCoder (25. August 2010)

Die Klasse 'string' hat keinen Konstruktur, dem ein 'int' übergeben werden kann. Spricht was dagegen, die Eingabe gleich in einen String zu schreiben?

```
string string2;
cin >> string2;
```
Andernfalls müsstest du 'binar' erst in einen String konvertieren, etwa mit Hilfe eines Stringstreams:

```
stringstream sstr;
sstr << binar;
string string2 = sstr.str();
```
Gruß
MCoder


----------



## berlusio (7. Januar 2013)

Das geht auch völlig ohne String indem du den Modulo-Operator verwendest. Hatte dieselbe Aufgabe zu lösen. Indem du durch Modulo 10 rechnest trennst du durch die ganzahlige Division immer die letzte Stelle ab. Also 123456/10 ergibt 12345.6 durch %10 trennst erhältst du nur den Wert 6. Ich hab eine Funktion geschrieben, die das quasi erledigt und dann die einzelnen Zahlen summiert. Vielleicht kannst du dann mehr damit anfangen.


```
# include <stdio.h>

int main()
{
int zahl, ziffernsumme;
ziffernsumme=0;
int i=0;
int zaehler;

printf("\n\nDieses Programm berechnet aus einer beliebigen Zahl n die \nZiffernsumme/Quersumme\n\n");
printf("\nEingabe der Zahl: ");
scanf("%d", &zahl);
zaehler=zahl;

while(zaehler>10)
{
zaehler=zaehler/10;
i++;

for(i=0;i<zaehler;i++)
{
ziffernsumme = ziffernsumme+zahl%10;
zahl=zahl/10;
}


}
printf("Ergebnis: %d\n", ziffernsumme);

return 0;

}
```
.


----------



## Endurion (8. Januar 2013)

substr gibt einen std::string zurück. Du hast auch den zweiten Parameter falsch, substr nimmt Index, Anzahl.

Wenn du einzelne chars im std::string ansprechen willst, kannst du den []-Operator nehmen:

char p10 = string1[10];


----------

