Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » wieso geht das nicht ?

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
09.11.2003, 19:35 Uhr
~cmos
Gast



C++:
class test
{
    private:
        char abc;
    public:
        void gib_char();
        void lesen();
};
void test::gib_char()
{
    cin >> abc;
}
void test::lesen()
{
    cout << abc;
}

int main()
{
    test obj_test;
    obj_test.gib_char();
    obj_test.lesen();
    return 0;
}


Wieso erhalte ich bei der Ausgabe nur den ersten buchstaben ?
wenn das nicht als klasse geschrieben ist wird mir das ganze
wort angezeigt. schreibe ich nun char abc[10] ist die ausgabe
wieder in ordnung...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
09.11.2003, 19:54 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


Ein "char" ist nur Ein Buchstabe. Um mehrere aufzunehmen musst du schon char-Arrays benutzen oder std::string
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
09.11.2003, 20:12 Uhr
Pablo
Supertux
(Operator)



C++:
class test
{
    private:
        [b]char* abc;[/b]
    public:
        void gib_char();
        void lesen();
};



besser wäre

C++:
class test
{
    private:
        [b]std::string abc;[/b]
    public:
        void gib_char();
        void lesen();
};



wie @Flo schon gesagt hat.
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
09.11.2003, 21:48 Uhr
~cmos
Gast


Hi,
aber unter main
char a;
kann man auch mehrere Zeichen eingeben..werden auch
ausgegeben. Das wars was mich verwundert hat.
Ich habe gelesen das char *abc nur ein zeiger auf char ist
und nur den Platz für den zeiger reserviert hat und nicht für zeichen.
also müßte ich noch eine 2. char variable erstellen auf die char* zeigt (?)
So stehts jedenfalls bei mir beschrieben.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
09.11.2003, 22:05 Uhr
0xdeadbeef
Gott
(Operator)


Eigentlich wird char* eher als String benutzt, zumindest in C. Oder als Referenz auf einen char, aber das ist eher selten. Die Idee ist, dass du irgendwo im Speicher deine Zeichenkette stehen hast und nur die Speicheradresse weitergibst. Allerdings kriegst du, wenn du nen char* anforderst, auch nur Speicher für den Zeiger, nicht für den String, auf den er nachher zeigt. Das macht aus Performance-Gründen auch Sinn. In C ist die normale Verfahrensweise daher, einen Buffer anzufordern und darein zu schreiben, also:

C++:
char buffer[100];


Das fordert ein char-Array der Länge 100 an, bietet also Platz für einen 99 Zeichen langen String und den Sentinel. In C++ dagegen ist der kanonische Weg, std::string zu benutzen. Diese Klasse übernimmt dann das Speichermanagement für dich.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
09.11.2003, 22:10 Uhr
Pablo
Supertux
(Operator)


char ist ein Datentyp, der nue ein Zeichen speichert.


C++:
char a = "Hallo";



ist falsch, weil a kein Pointer ist. Aber


C++:
char a = 'a';



ist richtig, das a nur ein Zeichen ist.

Um eine Zeichenkette zu speichern, muss man ein Pointer über char deklarieren (char*)


C++:
char* a = "Hallo";



Es gilt:

Code:
a[0] = 'H';
a[1] = 'a';
a[2] = 'l';
a[3] = 'l';
a[4] = 'o';
a[5] = '\0';


a zeigt auf 'H' aber wenn du std::cout << a; benutzt oder printf("%s", a); benutzt, oder string Funktionen benutzt, werden sie alle Zeichen nach 'H' ausgeben, bis sie das 0-terminierende Zeichen '\0' finden, dann wissen sie, wann die Zeichenkette fertig ist.

Tu was ich gepostst habe, ich würde aber an deiner Stelle std:.string nehmen, weil mit std::string die Problem mit der Länge des Arrays nicht hast, und brauchst du auch keine Copy-Ctors.


Bearbeitung:
Mist, @beefy war wohl bisschen schneller

--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!

Dieser Post wurde am 09.11.2003 um 22:10 Uhr von Pablo Yanez Trujillo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
10.11.2003, 09:05 Uhr
ao

(Operator)



Zitat:
~cmos postete
Hi,
aber unter main
char a;
kann man auch mehrere Zeichen eingeben..werden auch
ausgegeben. Das wars was mich verwundert hat.


Da hat der Compiler zufälligerweise die Variablen im Speicher so angeordnet, dass hinter dem a noch Platz frei war. Das ist zulässig und hat in einem korrekten Programm keine Auswirkungen. In deinem Programm hat es leider den Fehler verschleiert.

Speichern von mehreren Zeichen in einem "char" geht nicht und führt im allgemeinen zu einem Programmabsturz und ist darum immer ein Programmierfehler. Auch wenns bei dir ausnahmsweise funktioniert hat.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
10.11.2003, 21:57 Uhr
~cmos
Gast


Hi,
danke erstmal für die vielen Tips.
Hab mir das alles nochmal angeschaut...

ciao...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
10.11.2003, 22:00 Uhr
~cmos
Gast


Hi,
ich nochmal.
Wie ist eigentlich richtig mit den Klassen ?
Nehmen wir das Beispiel oben nochmal.
Werden die so geschrieben das die
auch die ein und ausgabe übernehmen (wie oben)
oder sollte das so sein das man beispielse
werte übergibt ?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
10.11.2003, 22:39 Uhr
Pablo
Supertux
(Operator)


Dans hängt nur von dir ab, besser gesagt, von der Stuktur der Klasse ab. Wenn du weißt, du gibst nur in stdout aus, dann kann die Klasse das für dich tun. Aber wenn du aber willst, dass nicht immer in stdout ausgegeben wird, bsp. Printer, Datei, als String, dann solltest du den << Operator überladen, das macht Sachen einfacher wie:

C++:
myclass myobject();
...
std:.cout << myobject << std::endl;
...


--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ 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: