Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Probleme mit char*

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 < [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ]
000
04.09.2003, 22:17 Uhr
~Anfänger00
Gast


Hallo
ich hab ein Problem mit char.

C++:
char* text = "Hallo";
text[1]= 'e';
cout<<text;


Immer wenn ich ein Element einer char* Zeichenkette veränder
und es dann !ausgeben will stürzt das Programm ab.
Woran kann das liegen?
Und wie kann ich das Problem (char*!) lösen?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
04.09.2003, 22:46 Uhr
Pablo
Supertux
(Operator)


Ich glaube, dass das Problem ist, dass Text als char* deklariert ist und nicht als char[]. Ich kann aber nicht genau sagen, wieso.

Aber mach folgendes, das funktioniert:

C++:
char text[10];
strcpy(text,"Hallo\n");
text[1] = 'e';
cout<<text;


Die Ausgabe wäre Hello
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!

Dieser Post wurde am 04.09.2003 um 22:47 Uhr von Pablo Yanez Trujillo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
04.09.2003, 23:40 Uhr
Marty



@Anfänger00

Wenn du unbedingt mit dynamischer Speicherverwaltung arbeiten willst solltest du das so machen:


C++:
int main()
{
    char* text = (char *)malloc(6*sizeof(char));
    strcpy(text, "Hallo");
    text[1]= 'e';
    cout << text;
    char x=*text;
    free(text);
}


--
MfG,
Marty

Ein Mensch sieht ein, und das ist wichtig, nichts ist ganz falsch und nichts ganz richtig.
(Eugen Roth)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
04.09.2003, 23:49 Uhr
0xdeadbeef
Gott
(Operator)


Es geht doch nur um Initialisierung.

Was auf jeden Fall gehen sollte, ist

C++:
char text[] = "Hallo";
text[1] = 'e':
cout << text << endl;


Was das mit dem * angeht, da werd ich morgen mal nach sehen, wenn ich wieder nen Compiler hab.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
04.09.2003, 23:58 Uhr
Pablo
Supertux
(Operator)


Ich weiß nicht, ob es in diesem Fall gut ist, malloc bzw. new (in C++) zu nehmen. Ich bin jedenfalls der Meinung, man sollte malloc und new vermeiden. Ich glaube, das sagt auch Stroustrup in seinem Buch, ich bin aber nicht sicher.
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
05.09.2003, 07:00 Uhr
virtual
Sexiest Bit alive
(Operator)


Der Unterschied zwischen

C++:
char text[] = "hallo";


und

C++:
char text* = "hallo";


Ist der, daß ersteres eine Arrayinitialisierung ist und Letzteres eine Pointerinialitierung. Bei einer Arrayinitialisierung werden alle 6 Elemente des Strings "Hallo" in ein Array namens "text" kopiert. Die Varaible text ist 6 Bytes groß und man kann auf ihr lesen und schreiben.
Bei einer Pointerinitialisierung wird einfach der Pointer, also die Speicheraddresse des Strings "hallo" gespeichert. Die Variable ist 4 Bytes (genauer: sizeof(char*)) groß und die Frage, ob man schreiben darf, hängt nicht unerheblich davon ab, wohin der Pointer zeigt. Naja, und bei einem konstanten String "hallo" ist der Typ des Strings selbst eben const char[] und wird vom Linker direkt in ein read only Speichersegment gelegt.
Mit der Zuweisung oben castest du das const aber implizit weg und schreibst trotzdem drauf, was aber nicht gehen soll und daher der Absturz.

Gute Compiler sollten hier warnen können (gcc zB Option -Wwrite-strings).

edit: Kampf den Rechtschreibfehlern.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)

Dieser Post wurde am 05.09.2003 um 09:37 Uhr von virtual editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
05.09.2003, 10:25 Uhr
~Anfänger00
Gast


Ja das er auch aber,warnings sagen mir nicht so viel
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
05.09.2003, 10:53 Uhr
virtual
Sexiest Bit alive
(Operator)


Ein auszuag aus den netten Sprüchen, die über meinem Bett hängen :

Zitat:

...
Regel 117: Ignoriere Warnungen nur dann, wenn Du genau weißt, was sie bedeuten.
...
Regel 231: Wenn Du mit einer Warnung nichts anfangen kannst, frag jemanden, der sich damit auskennt.
...
Regel 497: Disable niemals die Warnungen des Compilers, es sei denn Du kannst sie gemäß Regel 117 ignorieren.
...



--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
05.09.2003, 11:23 Uhr
0xdeadbeef
Gott
(Operator)


Sowas wie

Code:
warning C4786: 'std::reverse_bidirectional_iterator<std::_Tree<CMyClass,std::pair<CMyClass const,double>,std::map<CMyClass,double,std::less<CMyClass>,std::allocator<double> >::_Kfn,std::less<CMyClass>,std::allocator<double> >::iterator,std::pair<CMyClass const ,double>,std::pair<CMyClass const ,double> &,std::pair<CMyClass const ,double> *,int>' : identifier was truncated to '255' characters in the debug information


fällt zum Beispiel unter 117.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 05.09.2003 um 11:23 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
05.09.2003, 16:57 Uhr
~Anfänger00
Gast


@beefy:

Ok ich hab nun ein anderes Problem:
Ich möchte mithilfe einer Funktion Zahlen die so übergeben werden können:

C++:
longdez Test; //longdez steht für long dezimalzahl
char* x = "100"
Test = x; // oder longdez = "100"
cout<<Test.Ausgabe; //gibt die Zahl aus; (Ausgabe ist public und vom
                              // typ char Ausgabe[32]


Das geht schon mal,aber da kommt dann halt:

C++:
10000000000000000000000000000000
//Satt:
00000000000000000000000000000100 //so sollte es auschauen

// meine Funktion
longdez longdez::operator=(char* Ztext)
{
for(int i=31;i>sizeof(Ztext)+(i-sizeof(Ztext));i--) //hier bastle ich gerade
{                                          
this->Ziffer[i]= Ztext[]; //hier auch       //also macht gerade keinen Sinn!!
}
strcpy(Ausgabe,this->Ziffer);
};



Wie kann ich das jetzt richtig umkonvertieren also wenn:

C++:
this->Ziffer[31] = Ztext[2];
this->Ziffer[30] = Ztext[1];
this->Ziffer[29] = Ztext[0];

//Was zu:
1 2 3.. 29 30  31
0 0 0.. 1   0   0
//führen würde



Könnt ihr mir helfen?
Gibt es eigentlich irgendwo Datentypen,die größer als int sind?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ]     [ C / C++ (ANSI-Standard) ]  


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: