Char vergleich Problem
-
char variable [8 + 1];
Das befindet sich in der Klasse Test
Ich habe das value per debugger "dbx" abgefragt und es ist im normalen format "" und wenn ich es als ein "char" rauscaste ein '\0', habe jetzt ebenso mit NULL und 0x00 versucht. Ich werde schauen ob ich es ausprinten kann.
Gruss Alcatros
-
Hallo alcatros,
if (*variable == 0) ...;
oder
if (*variable == '\0') ...;
oder
if (variable[0] == '\0') ...;
...
Gruß Frank
-
Dieser Thread wurde von Moderator/in nman aus dem Forum Linux/Unix in das Forum ANSI C verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Nun erklärt ihm auch, warum:
Ein Array ist im Prinzip ein Pointer mit allokiertem Speicher. Fragst du also nur Variable == 0 ab, überprüfst du, ob Variable ein Null-Pointer ist. Stattdessen musst du aber den Inhalt überprüfen, entweder wie beschrieben oder mit strlen(Variable)==0.
Dass der Debugger "" anzeigt, ist eigentlich ein Kompfort, da der davon ausgeht, dass die Adresse deines Arrays dich eh nicht interessiert, sondern nur der Inhalt. So ganz richtig ist die Anzeige daher nicht.
-
Heimelchen schrieb:
Ein Array ist im Prinzip ein Pointer mit allokiertem Speicher.
diese Aussage ist nicht wahr und sollte so nicht weitergegeben werden. Arrays (Typ unabhängig) sind keine Zeiger, sie verhalten sich jedoch ähnlich wie Zeiger und bei
typ arr[10]
referenziertarr
auf&(arr[0])
. Bei Arrays gilt sogar&arr == arr
, was bei Zeigern so gut wie nie der Fall ist.char o[10], *p = "hallo"; printf("o = %p, &(o[0]) = %p, &o = %p\n", o, &(o[0]), &o); printf("p = %p, &(p[0]) = %p, &p = %p\n", p, &(p[0]), &p);
Ausgabe:
o = 0xbfa4ba26, &(o[0]) = 0xbfa4ba26, &o = 0xbfa4ba26 p = 0x80486c0, &(p[0]) = 0x80486c0, &p = 0xbfa4ba20
-
Hallo Zusammen,
Danke für die vielen Hilfestellungen und antworten.
Ich habe es jetzt so gecoded:
throw EMPTY_EXCEPTION;
}Ich bin mir nicht 100% sicher ob ich eine Garantie habe das der Compiler das so wandelt das es von links nach rechts geht, falls er jemals das Array value nutzen würde bevor er prüft ob der Array überhaupt initialisiert ist.
Ich habe schon oft Gegoogelt ob es irgendwo ein Java to C++ Tutorial hat, klebe nun ab und zu an den Problemen vor denen man in Java so nett geschützt ist falls jemand eines kennt das gut ist werde ich mir das jederzeit gerne anschauen.
Gruss Alcatros
-
Das sollte in C genauso sein...
Die Abfrage sollte variable[0]== '\0' lauten, weil du ja die erste Position abfragen willst. Die Überprüfung auf Nullpointer ist schonmal ganz gut, ist Variable ein Array, aber überflüssig.
Und benutz mal bitte C-Code-Tags (da gibts nen Button für, gleich unter den Smilies).
-
Vielleicht sollte man noch darauf hinweisen, dass es in C keine Ausnahme (exception gibt, die man werfen könnte, und da ein Java to C++ Tutorial gesucht wird (sorry, ich kenne keines ohne zu suchen), sind wird wohl schon wieder im falschen Forum.
MfG,
Probe-Nutzer
-
Bis jetzt is alles noch AnsiC, außer das Tutorial...
-
Heimelchen schrieb:
Bis jetzt is alles noch AnsiC, außer das Tutorial...
Nein, darf ich dezent auf diese Zeile hinweisen (throw-Schlüsselwort!):
throw EMPTY_EXCEPTION;
MfG,
Probe-Nutzer
-
Ich denke auch das wir im C++ teil sein müssten, da ich zumindest in C++ zu programmieren versuche, aber man kann es dem Bot nicht verübeln das er das ganze gleich verschoben hat, wenn wir noch genauer sein wollen ist es C++ auf AIX Systemen darum habe ich am Anfang auch Unix gewählt. Ich hatte jedoch auch das Gefühl das die Exceptions unterschiedlich sind.
In Java zb. kann ich eine Methode auf die "Schnauze" fliegen lassen und dan wirft diese eine exception, es scheint mir so als würde das in C++ nicht ganz so Funktionieren aber ich werde mir wohl nochmals im Google was suchen, bis jetzt habe ich nur die "präventiven" throws gesehen in Tutorials.
Gruss & Danke,
Alcatros
-
Die Tatsache, dass du in C++ programmierst, bedeutet ja noch nicht, dass du C++ programmierst. C++ unterstützt ja auch die Ansi C Syntax und die bleibt natürlich Ansi C, auch wenn sie in einer C++-Datei steht. C++ wird es erst dann, wenn sowas wie Klassen oder Exceptions ins Spiel kommen, weil die expliziet erst in C++ definiert werden.
So ähnlich ist das auch mit Unix oder Linux. Nur weil du unter Unix programmierst und für Unix entwickelst, wird aus C/C++ keine Unix-Sprache. Es bleibt C/C++, erst wenn du betriebssystem-spezifische Funktionen verwendest (API), verlässt du C/C++ (natürlich nur hier im Forum, die API ist auch in C/C++).Zu deinem Problem: du verwendest zwar eine Klasse, aber das eigentlich Problem besteht mit einem char-Array. Und das ist sowas von C.....
-
Heimelchen schrieb:
Die Tatsache, dass du in C++ programmierst, bedeutet ja noch nicht, dass du C++ programmierst. C++ unterstützt ja auch die Ansi C Syntax und die bleibt natürlich Ansi C, auch wenn sie in einer C++-Datei steht.
verbreite solche Lügen nicht. Ein großer Teil von ANSI C wird in C++ unterstützt, aber nicht alles. Siehe http://david.tribble.com/text/cdiffs.htm
#include <stdio.h> int main(void) { printf("C%s\n", sizeof(char) == sizeof('a') ? "++" : ""); return 0; }
dieser Code ist C, kompilierst du ihn aber mit einem C++ Compiler, dann bekommst du eine andere Ausgabe als mit einem C Compiler.
Außerdem ist C++ eine Multiparadigma Sprache und nur weil du keine Klassen und Exceptions nutzt, heißt nicht, dass du deswegen C++ nicht verwendest.
-
supertux schrieb:
printf("C%s\n", sizeof(char) == sizeof('a') ? "++" : "");
Beleuchtet dieses Beispiel vielleicht eher eine Eigenart eines Compilers als die Unterschiede zwischen C und C++? Ein char ist ein char und 1 Byte groß! Ob der Compiler 'a' als char oder w_char oder AnsiString interpretiert, ist Sache des Compilers und nicht der Programmiersprache.
sizeof(int) liefert nicht mal bei allen C-Compilern das gleiche Ergebnis!Abgesehen davon wollte ich keinen Aufsatz über die Unterschiede zwischen C und C++ verfassen, sondern einem "Anfänger" einen kleinen Wink geben.
-
Danke für alle Antworten.
Das Problem das wir hier auch haben ist das ein Byte nicht immer 8 bit gross ist ect ect ect... aber ich würde schon gerne auf den C++ standard bauen, C finde ich auch gut, wer jedoch OO gelernt hat und von der Java Seite kommt braucht Polymorphismus ect...
-
Heimelchen schrieb:
supertux schrieb:
printf("C%s\n", sizeof(char) == sizeof('a') ? "++" : "");
Beleuchtet dieses Beispiel vielleicht eher eine Eigenart eines Compilers als die Unterschiede zwischen C und C++?
Beides, aber in erster Linie den Sprachunterschied. 'a' ist in C int, in C++ char.
sizeof(char)==sizeof('a')
gilt also, wenn es C++ ist oder wenn sizeof(int)==1 ist, wobei letzteres eher selten der Fall sein dürfte.
-
Bashar schrieb:
'a' ist in C int, in C++ char.
Das will ich doch schwer bezweifeln.
-
Du willst, aber du bringst es nicht übers Herz? Oder wie soll ich das verstehen? Nachlesen darfst du das aber gerne selbst
-
In meinen Büchern steht davon nix. Würd mich auch wundern, programmiere ich in meinen Controller ein int, belegt das zwei Byte, ein char dagegen nur eins. Zwar kann man zwei in eins stecken, aber gleich sind sie deswegen noch lange nicht.
Guck doch mal bei deinem Compiler nach dem Charset und stell ihn auf ASCII, dann wird aus deinem "int" ganz schnell ein char.
-
Heimelchen schrieb:
In meinen Büchern steht davon nix.
Aha. Das soll mir was sagen? Deine Bücher und dein Compiler tun hier überhaupt nichts zur Sache (wobei ich bezweifle, dass du tatsächlich irgendwo gefunden hast, dass eine Zeichenkonstante den Typ char haben muss; und erst recht hast du nicht ausprobiert, ob sizeof('a') vielleicht ungleich 1 sein könnte). Solche Fragen kann man sich beantworten, indem man die Sprachdefinition von C im ANSI-C-Standard nachliest.