2016-08-29 7 views
3

ich in einem String aus dem stdinput über Readline-() a la nehme:Grabbing Das erste Zeichen eines String

char * cmdLine = readline(); 

Dann will ich sehen, ob das erste Zeichen des über Readline- erzeugten string() ist ein Ausrufezeichen. Aber der Code

if(cmdLine[0]=="!") 

tut das nicht für mich, wie ich gedacht hätte. Ich dachte, dass, wenn die Zeichenfolge aus stdin verhakt sind! „1“ zum Beispiel dann wäre es wahr sein, dass

cmdLine[0]=="!" 

Wenn cmdLine einen Zeiger auf eine Zeichenfolge ist, dann kann mich nicht bei jedem Zeichen sehe in der Zeichenfolge mit Array-Klammern? Ich weiß, das ist eine dumme grundlegende c/pointer Frage, aber das ist wirklich stolpern mich auf ...

+4

Der Versuch, eine ganze Zahl zu vergleichen (cmdLine [0]) mit einem Zeiger („!“) Sollte eine dicke, fette Compiler-Warnung erstellt haben. Wenn dies nicht der Fall ist, finden Sie heraus, wie Sie die Warnungen höher setzen können. –

+0

Hier ist eine andere Frage: Klingt Ihr Kommentar hilfreich? Wenn ja, dann bist du ein viel besserer Programmierer als hilfreiche Person ... – nbk

+0

Ja, es ist hilfreich. Sobald die Compilerwarnungen aktiviert sind, werden diese Probleme viel früher angezeigt. Deshalb haben Compiler * Warnungen *. –

Antwort

8

Ändern "!" zu '!'. Sie vergleichen ein einzelnes Zeichen mit einem anderen Zeichen.

In Ihrem C ein Zeichen mit einfachen Anführungszeichen

+0

Danke! Ich schätze deine Antwort. – nbk

+0

@nbk dann sei fair und markieren Sie es als die angenommene Antwort! –

1

Die doppelten Anführungszeichen in C angeben wird verwendet, um einen Array von Zeichen darzustellen. Das Nullzeichen wird standardmäßig an das angehängt, was auch immer Sie in die Anführungszeichen setzen. So

"!" // makes for two characters the '!' and the terminating null character '\0'. 

Ihre Absicht ist klar einzelnes Zeichen zu vergleichen, um ein einzelnes Zeichen sollte in einfachen Anführungszeichen eingeschlossen werden. So wäre der richtige Vergleich

if(cmdLine[0]=='!') 

sein Was mit cmdLine[0]=="!" passiert?

Wie der erste Teil meiner Antwort sagt, macht die "!" eine Null abgeschlossen Array von Zeichen oder eine gültige Zeichenfolge. Diese (konstante) Zeichenfolge wird im Datensegmentteil einer Objektdatei gespeichert. Ein Verweis auf "x" gibt Ihnen die Startadresse des Strings, dh Sie erhalten einen Zeiger. Daher, wenn Sie tun

if(cmdLine[0]=='!') 

Du vergleichst eine ganze Zahl (beachten Sie, dass char ist ein Integer-Typ) mit einem Zeiger. Obwohl dies möglicherweise keinen Fehler erzeugt (dies wird in Punkt 2 der [ this ] Antwort angesprochen), werden Sie nicht die beabsichtigten Ergebnisse erhalten.

+1

Danke! Ich schätze deine Antwort. – nbk

4

Sie haben zwei Fehler:

  1. Die erste (weniger wichtig) ist, dass Sie ein Zeichen auf einen Zeiger vergleichen. Die Antwort von element11 spricht diesen Punkt an.

  2. Der zweite (wichtigere) Fehler ist, dass die Warnstufe Ihres Build-Prozesses zu niedrig ist. Das zu beheben ist wichtiger, weil es nicht nur hilft, den Fehler # 1 zu finden, sondern wahrscheinlich auch viele andere Fehler.

Wie man das macht, hängt von Ihrem Compiler ab.Wenn gcc verwenden, die -Wall -pedantic Optionen sind ein guter Anfang:

$ gcc -Wall -pedantic test.c 
test.c: In function ‘main’: 
test.c:7:16: warning: comparison between pointer and integer 
    if (cmdLine[0]=="!") { 
       ^
test.c:7:16: warning: comparison with string literal results in unspecified behavior [-Waddress] 
+0

Gute Infos hier. In c ist undefiniertes Verhalten das Letzte, was Sie wollen. C ist oft sehr glücklich, mit undefiniertem Verhalten so weiterzumachen, als wäre nichts Schlimmes passiert. Die ganze Zeit geben Sie die Ausgabe, die Sie nicht erwarten. Es ist eine gute Sache, dass Ihr Compiler diese erkennt. Wenn die Größe Ihres Programms zunimmt, kann undefiniertes Verhalten ein Alptraum sein. – element11

Verwandte Themen