Re: [maillist] C++ Problem

ThomasWeller (ThomasWeller@t-online.de)
Fri, 20 Aug 1999 18:28:32 +0200

> > > 'n' belegt genau* einen Speicherplatz der Größe char
> > > "n" belegt genau* zwei Speicherplätze der Größe char
> > >
> > > "Strings" sind immer Null-terminiert...
> > >
> > > "n" paßt also nur in ein Array x mit der Deklaration:
> > > char x[2] (oder mehr)
> > Das wiederum sind allerdings 3 Bytes, nämlich das x[0] für die Längenangabe,
> > wenn ich richtig liege, das x[1] fürs 'n' und das x[2] für '\0' (00 hex).
> >
>
> ich gebs zu, unter C hab ich mit 'diesen' Zeichen nichts gemacht - ich
> habs eben mal probiert, es geht so ned.
> das folgende Programm
> <---------
> u_char string[8];
> u_char x = 0;
>
> for (x=0;x<8;x++) {
> string[x] = 0xcc;
> }
> strcpy(string,"n");
> for (x=0;x<8;x++) {
> printf ("0x%02x ",string[x]);
> }
> ------>
> mit dem ergebnis:
> tmp> a.out
> 0x6e 0x00 0xcc 0xcc 0xcc 0xcc 0xcc 0xcc

Na also. Das ist doch nicht ganz schlecht.

>
> zeigt, daß tatsächlich zwei Byte reingelegt werden.
> x[2] sind tatsächlich zwei Byte: x[0] und x[1];
> x[2] ist out of range.
> Ein strcpy(string,'n'); gibt beim Compilieren Warning und beim Ausführen
> coredump.
> was ist da verkehrt?

Das mit der Längenangabe in string[0] geht wohl nur bei char *string (siehe
andere Mail).
Dass strcpy(string,'n') nicht geht liegt wohl daran, dass 'n' eben kein String
ist, jedoch ein String benötigt wird (der eben mit '\0' abgeschlossen wird)
Was meinen die Profis?

Ich werde hier im Wohnheim-Web noch eine C/C++ FAQ einrichten, wenn ich dann
bald kann :-) Ist nicht schlecht, dass sowas hier diskutiert wird, finde ich,
obwohl es vielleicht auch C-Maillisten gibt.

Hier noch mal das ursprüngliche Problem:

> main(){
> char jn[2];
> cout << "[J/n]" ; cin >> jn;
> if ( jn==´n´ ) // Ich glaub hier macht er schtunk
> cout << "Test" << endl;
> }

Ich glaube, die Frage ist, was cin wirklich einliest, char oder string. Aber das
lässt sich ja mit einer Abwandlung des obigen Programms testen, etwa so:
main(){
char jn[2];
for (x=0;x<2;x++) {
jn[x] = 0xcc;
}
cin >> jn;
for (x=0;x<2;x++) {
printf ("0x%02x ",jn[x]);
}
}
Ich habe das leider nicht testen können, da ich die C-Programme unter Linux noch
nicht gefunden habe (Auch hier unter Win hab ich grad keins da). Das Programm
könnte aber laufen :-)

Ja nach Ergebnis muss man dann abwägen, welche Lösung in Betracht kommt,
beispielsweise diese:

main(){
char jn; // hier die [2] weglassen
cout << "[J/n]" ; cin >> jn;
if ( jn==´n´ )
cout << "Test" << endl;
}

Oder die:

main(){
char jn[]; // hier String anstatt Char[2]
cout << "[J/n]" ; cin >> jn;
if ( jn=="n" ) // hier dann den String "n" anstatt Char 'n'
cout << "Test" << endl;
}

Ich denke, der zuletzt beschriebene Umweg ist für original C-Programmierer zu
lang, nicht prägnant genug und durch strcmp langsam. Ausserdem ist er ja ein Mix
aus Char und String, was vielleicht funktioniert, aber nicht unbedingt logisch
ist.
> main(){
> char jn[2];
> char jnn[] = "n";
> cin >> jn;
> if ( ! (strcmp(jn,jnn)))
> {
> cout << "Test" << endl;
> }
> return; // Wo kommt das eigentlich her ?
> }

Danke für Eure Beteiligung. Ich muss unbedingt einen C-Editor und Compiler
finden. kc, kc++ oder xc, xc++ oder bashc ? Oder ist bei der 'Lite' keins dabei?

Thomas