PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Grundlagen... Pointer auf Strings / Arrays



fugitivus
26.01.2011, 14:57
Hi !

Ich hab irgendwie Probleme damit Pointer richtig zu Verstehen...

Beispiel:

In folgendem Code will ich eigendlich nur Zeichen von einen String in den Anderen Schieben....



char strIn[] = "123.321";
char strOut[] = "";

char *inPtr = (char *)&strIn;
char *outPtr = (char *)&strOut;

while(*inPtr++ != 46)*outPtr++ = *inPtr;


Was Mache ich Falsch ?
Geht das überhaupt so ?

Danke für Jedliche Antwort. Mfg Fugitivus

PicNick
26.01.2011, 15:07
Bei dir hat "strout" keine ausreichende Länge, ( char strOut[] = ""; )
und gleich dahinter stehen deine Pointer.
Es ist zu vermuten, dass du mit dem Byte transfer dann deine Pointer vernichtest und im Nirwana landest.

askazo
26.01.2011, 15:18
PicNic hat den gröbsten Fehler schon erwähnt. Du musst für Deinen Ergebnis-String ausreichend Speicherplatz reservieren.

Der zweite Fehler ist, dass Du den inPtr zu früh inkrementierst. So würdest Du das erste Zeichen verlieren.

So würde Dein Code funktionieren:



char strIn[] = "123.321";
char strOut[8] = "";

char *inPtr = (char *)&strIn;
char *outPtr = (char *)&strOut;

while(*inPtr != 46) *outPtr++ = *inPtr++;

fugitivus
26.01.2011, 15:25
hab es jezt mal so versucht:



char strIn[] = "123.321";
char strOut[20] = "";

char *inPtr = (char *)&strIn;
char *outPtr = (char *)&strOut;

while(*inPtr++ != 46)*outPtr++ = *inPtr;


jezt stürzt mir gleich der mc ab......
komme mir unheimlich blöde vor....

Mfg Fugitivus

fugitivus
26.01.2011, 15:31
Danke für Eure Antworten !

askazo : jo... da war er der gedankenfehler....
komisch ich dachte das inPtr erst nach schleifendurchlauf incrementiert wird...
aber da hab ich mal nen gedankenfehler der mich schohn sehr sehr oft gepiesakt hatt....

DANKE !

ach so... in zukunft werde ich dann mal vorher feste längen zuweisen xD

Mfg Fugitievus....

fugitivus
26.01.2011, 15:45
Hi !
Ich weiß nicht mehr weiter....
jezt stürzt mir der mc nur noch ab xD



double strtodbl(char strValue[])
{
int vkOut = 0;

char strOut[20] = "";
double outValue = 0;

char *inPtr = (char *)&strValue;
char *outPtr = (char *)&strOut;

while(*inPtr != 46)
{
*outPtr++ = *inPtr++;
}
*++outPtr = '\n';
vkOut = atoi(strOut);
outValue = (double)vkOut;

return outValue;
}


Ich weiß es echt nicht mehr... liegt es jezt am pointer ? was übergebe ich hier, wo falsch ? Pointer Magie..... ich verstehe warum es diesen ausdruck gibt xD

PicNick
26.01.2011, 16:42
Gott bewahre dich, dass einmal eine Zahl kommt OHNE dezimalpunkt. Da kommt er aus "while" nicht mehr zurück

Klingt so, als wolltest du die dezimalen abzwicken und den ganzenzahligen Teil in ein double stellen ? Warum dann aber eine float-Zahl ?

empfehle:

int vkOut = atoi (strValue); // der atoi hört bei "." sowieso auf
double outValue = vkout;

fugitivus
26.01.2011, 18:28
hehe, weil ich pointer peilen will... war halt ne nette aufgabenstellung....

mfg fugitivus...

fugitivus
26.01.2011, 23:09
achso wegen dem Gottbewahre:

sry... so natürlich: while(*inPtr != 46 && *inPtr != 44){bla..}

mfg fugitivus

PicNick
27.01.2011, 10:27
@Flüchtiger, würde als Sicherstes empfehlen:

while(*inPtr >= '0' && *inPtr <= '9' ){bla..}


btw: pointer rumschubsen is ok, man lernt 'ne menge :-)
ausserdem sieht C viel professioneller aus, wenn jede Variable vorn und hint' mit sonderzeichen garniert ist

fugitivus
27.01.2011, 10:39
danke für den tipp !

hehe, professionelles aussehen xD.... da helfen bei mir auch keine sonderzeichen :-$

mfg fugitivus

sast
27.01.2011, 11:25
char strOut[20] = "";
...
char *outPtr = (char *)&strOut;

Nur mal als Gedankenstütze. strOut ist bereits ein Pointer auf strOut[0]. outPtr ist somit eigentlich ein Pointer auf den Pointer strOut.

Und mit dieser Information solltest du dir mal
*++outPtr = '\n';
vkOut = atoi(strOut);
ansehen.

PS: mein Tipp:
char *outPtr = strOut; oder char *outPtr = (char *)&strOut[0];

sast

fugitivus
27.01.2011, 11:37
hehe,
sowas hab ich mir gestern von nem kollegen schon mal anhören dürfen...

mfg fugitivus

sast
27.01.2011, 12:04
Mit dem Referenzieren und Dereferenzieren ist es wie mit Klammern. Wenn ich zwei Klammern aufmache, muss ich auch zwei wieder schließen und zwar an der passenden Stelle.

sast