Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » c=getchar

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 <
010
12.10.2003, 17:46 Uhr
Pablo
Supertux
(Operator)


Nochmal zum Thema: In Wirklichkeit könntest du schon die Zeichenkette als ein Array bzw. Feld von ints speichern. Da jedes Zeichen als eine Zahl sich darstellen lässt, ist das möglich:


C++:
#include <stdio.h>
int main()
{
    int *x = "Ich bin ein Array von int und speichere eine Zeichenkette, hihi.";
    printf("%s\n", x);
    return 0;
}



Wenn ich das kompiliere, kriege ich aber 2 Warnungen

Code:
$ gcc -Wall ints.c -o ints
ints.c: In function `main':
ints.c:4: warning: initialization from incompatible pointer type
ints.c:5: warning: char format, different type arg (arg 2)



logisch, aber führt das aus.

Code:
$ ./ints
Ich bin ein Array von int und speichere eine Zeichenkette, hihi.



Ob das gut ist, weiß ich nicht, ich würde das nie tun in einem ernstem Projekt. Aber du kannst casten und dann sind die Warnungen so gut wie weg und dann kannst du sie problemlos benutzen. Das Problem ist, dass der Speicherplatz von x (in meinem Fall) 4 Mal größer als von einer char* Variable, die die Zeichenkette speichern würde, weil sizeof(int) > sizeof(char)
Normalerweise ist sizeof(char)==1, muss aber nicht sein. Wenn ich mich nicht irre, dann muss gelten sizeof(char) == sizeof(void) oder so.


C++:
#include <stdio.h>
int main()
{
    int *x = (int*) "Ich bin ein Array von int und speichere eine Zeichenkette, hihi.";
    printf("%s\n", (char*) x);
    return 0;
}



Wenn du das machst, dann sind die Warnungen weg. Würde ich trotzdem das nie machen. Das war nur ein Beispiel, dass es möglich ist, eine Zeichenkette in einem anderen Pointer zu speichern, vor allem, wenn es ein int Pointer ist.
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!

Dieser Post wurde am 12.10.2003 um 17:48 Uhr von Pablo Yanez Trujillo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
011
12.10.2003, 22:16 Uhr
virtual
Sexiest Bit alive
(Operator)


Gute Güte.
Ein Stringliteral hat den Typen const char* const, oder formaler char const * const oder in menschlicher Spache: Ein Strinliteratal ist hinsichtlich Lage im Speicher und Inhalt konstant.
Ein

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


Castet implizit das Const fort; die daraus resultuierenden Bugs sind hinglänglich bekannt.
Ein

C++:
int* hallo = (int*)"Hallo";


Castet sowhl Typ alsauch const fort; das hat aber alles nichts mehr mit der ursprünglichen Fragestellung zu tun und ist ziemlicher Humbug in den meisten Fällen, deshalb wundert es mich, weshalb es benutzt wird, um irgendwelche Sachen zu erklären.

Weiterhin ist
1. sizeof(char) == 1. Immer.
2. sizeof(char) <= sizeof(int). Auch immer
3. sizeof(void) ist nicht definiert. Ebenfalls immer.
--
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
012
12.10.2003, 22:29 Uhr
Pablo
Supertux
(Operator)



Zitat:
virtual postete

Ein

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


Castet implizit das Const fort; die daraus resultuierenden Bugs sind hinglänglich bekannt.



Deshlab kann man folgendes nicht tun?

C++:
char* p = "Irgendwas";
*p = 'i';



Das mit dem int* ist mir so eingefallen, weil @Newbee gefragt hat: "wie kann c als int Variable z.B. einen kompletten Satz aufnehmen". Dann hab ich das versucht und hat funktioniert, ich wollte nichts erklären, ich war aber begeistert, dass es sowas funktioniert hat. Aber das werde ich ne tun, dafür gibt es ja char, sonst gäbe es nicht.

Stimmt, sizeof(char) ist immer 1, ich hab mit sizeof(int) verwechselt, weil nciht immer 4 ist.
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
013
13.10.2003, 06:43 Uhr
virtual
Sexiest Bit alive
(Operator)



Zitat:
Pablo Yanez Trujillo postete

Deshlab kann man folgendes nicht tun?

C++:
char* p = "Irgendwas";
*p = 'i';




Richtig. Darf man nicht tun.
--
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
014
13.10.2003, 06:49 Uhr
Pablo
Supertux
(Operator)


Jetzt weiß ich warum immer Segementation falut kam. Ich habe geglaubt, weil es als pointer deklariert war. Deshalb fand ich ein bisschen komisch, dass mit malloc (und strcpy) das Problem gelöst war man lernt jeden Tag immer was neues.
--
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 ] > 2 <     [ 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: