2010-05-28 9 views
9
#include <stdlib.h> 
#include <stdio.h> 
#include <iostream> 
#include <string.h> 
using namespace std; 
int main() 
{ 
     string cmd; 
     while(strcmp(cmd.c_str(),"exit")==0 && strcmp(cmd.c_str(),"\exit")==0) 
     { 
       cin>>cmd; 
       cout<<cmd; 
     } 
     return 0; 
} 

Ich bin fest.Wie wird der String mit const char * verglichen?

+1

Es ist besser, den Code direkt in der Frage –

+0

@ Brian einzufügen: Ich ging und das tat. – sbi

+1

Außerdem ist es sauberer, wenn Sie cmd.compare ("exit") anstelle von strcmp (cms, c_str(), "exit") verwenden == 0 Sie schreiben C++ - Code. Warum nicht davon profitieren? – Vagrant

Antwort

13

Nach ein paar kleine Fehler zu beheben, das funktioniert auf meinem Rechner:

#include <cstdlib> 
#include <cstdio> 
#include <iostream> 
#include <cstring> 
#include <string> 

int main() 
{ 
     std::string cmd; 
     while(std::strcmp(cmd.c_str(),"exit")!=0 
      && std::strcmp(cmd.c_str(),"\\exit")!=0) 
     { 
       std::cin>>cmd; 
       std::cout<<cmd << '\n'; 
     } 
     return 0; 
} 

Allerdings frage ich mich, warum Sie std::strcmp() überhaupt verwenden möchten. Wie Sie gerade herausgefunden haben, ist es nicht so einfach zu bedienen wie die Klasse std::string. Diese

while(cmd!="exit" && cmd!="\\exit") 

funktioniert genauso gut, ist leichter zu verstehen, und damit einfacher, richtig zu bekommen.

+0

Die OP sollten die Eingabezeichenfolge konvertieren, bevor Vergleich in Kleinbuchstaben. Dadurch kann der Benutzer sowohl "Beenden" als auch "Beenden" eingeben. Die Begriffe zu erforschen sind: 'std :: transform' und' tolower'. –

+0

Es gibt auch 'strcasecmp' auf Unixy (vielleicht auch Windows) Systemen, den Fall ignoriert. – Joe

4

strcmp gibt 0 zurück, wenn sie gleich sind. Also ich denke du willst! = 0

Sicher strcmp wird nicht 0 für beide zurückgeben, weil es nicht beiden gleich sein kann.

Es sieht auch so aus, als hätten Sie einen Backslash am Anfang Ihrer Zeichenkette, Sie sollten das mit einem doppelten Backslash umgehen.

2

Die Bedingung in Ihrem während nie zu true bewerten, weil Sie die cmd Zeichenfolge zu überprüfen, sind die Prüfung auf "exit"und"\\exit" gleich ist. Eine Zeichenfolge kann niemals gleich zwei Werten gleichzeitig sein.

11

Eine std::string Instanz kann direkt mit einem String-Literal unter Verwendung von != oder == Operatoren verglichen werden. Dies macht Ihren Vergleich klarer.

Beachten Sie, dass \e kein gültiges Zeichen Flucht ist, müssen Sie die \ verdoppeln, wenn Sie eine wörtliche \\ gemeint.

while(cmd == "exit" && cmd == "\\exit") 

Offensichtlich cmd nicht auf zwei verschiedenen Saiten zugleich gleich sein kann, vermutlich gemeint Sie !=.

Überlegen Sie auch, ob std::getline(std::cin, cmd) geeigneter ist als std::cin >> cmd;. In beiden Fällen sollten Sie nach dem Erfolg der Leseoperation suchen, andernfalls können Sie in einer Endlosschleife enden, wenn der Stream geschlossen wird oder in einen Fehlerzustand eintritt.

Persönlich würde ich mit so etwas gehen, unter der Annahme, dass Sie den Befehl beenden möchten, wie Ihr Code tut.

#include <string> 
#include <iostream> 
#include <ostream> 

int main() 
{ 
    std::string cmd; 
    while (std::getline(std::cin, cmd)) 
    { 
     std::cout << cmd << std::endl; 
     if (cmd == "exit" || cmd == "\\exit") 
      break; 
    } 
    return 0; 
} 
+0

Dies ist die richtige Antwort. –

0

Ihr Problem sind die unter Bedingungen.

Sie wahrscheinlich die Schleife do verlassen wollen würden, wenn die User-Exit eintreten, so dass Sie verwenden sollen:

while(strcmp(cmd.c_str(),"exit")!=0 && strcmp(cmd.c_str(),"\exit")!=0) 
0

nur ein paar Dinge im Auge zu behalten, ich einige der Vorschläge bin bekräftigt, die Wiederholung wert sind während (1) mal.

  1. Sie verwenden C++, es ist objektorientiert, d. H. Es ist am besten, die Daten und die Funktion, die damit arbeitet, zu kombinieren.Verwenden Sie in diesem Fall die Zeichenfolgenvergleichsoptionen, die von der string-Klasse bereitgestellt werden, statt von strcmp.

  2. Es ist ein logischer Fehler in Ihrem Programm, auch wird es kompilieren, aber ich fürchte, das ist nicht das, was Sie wollen. if (a == x & & a == y), wird dies immer falsch sein, als nicht beide gleich x sein kann und y, es sei denn x = y, in Ihrem Fall klar x! = y.

Cheers, Pavan

Verwandte Themen