2009-08-16 14 views
0

Ich habe Probleme mit dem Vergleich in meinem C++ - Programm. Dies ist die gekochte Version.C-String Vergleichsproblem in C++

#include "stdafx.h" 
#include <iostream> 
#include <windows.h> 
using namespace std; 
int main(int argc, char *argv[]) 
{ 
    if(argc>2){cout<<"3+Args"<<endl;}else//??? 
    if(argc==2){ 
     cout<<"2args"<<endl; 
     if(argv[1]=="/hide-icons"){} 
     if(argv[1]=="/show-icons"){} 
     if(argv[1]=="/reinstall"){setAsDefault();} 
     if(argv[1]=="/?"){showPossibleCommands();} 
     if(argv[1]=="/1"){cout<<"go"<<endl;FirstRun();} 
    }else{showPossibleCommands();cout<<argv[0]<<endl;} 
    return 0; 
} 

Als ich "programname.exe/1" laufen, mein Programm schreibt "2args", aber nicht "gehen". Fehle ich etwas Offensichtliches?

+0

ja du bist .... – Tom

Antwort

18

argv[1] ist ein char*, also testet man mit ==, ob der Zeiger auf den gleichen Punkt wie der Anfang der verschiedenen String-Konstanten zeigt, die Sie verwenden ... was nicht der Fall sein wird. Um Inhalte stattdessen zu vergleichen, verwenden Sie strcmp.

+3

Oder stricmp, wenn Sie die Argumente sein wollen case insensitive –

+1

Oder strncmp, wenn Sie nur die ersten n Zeichen testen möchten. –

+2

'stricmp()' ist kein Standard. Chere ist kein richtiger Standard-C (oder C++, soweit ich das sagen kann - frage einen echten C++ - Programmierer), wie man einen String-Vergleich ohne Berücksichtigung der Groß-/Kleinschreibung durchführt. GCC stellt strcasecmp, VC++ bietet stric ... –

5

Das Problem ist, dass der Code die Zeiger mit den Strings vergleicht, nicht die Stiche selbst.

Sie müssen die Vergleiche durch Aufrufe der String-Compare-Funktion ersetzen.

z.

if(argv[1]=="/1"){cout<<"go"<<endl;FirstRun();} 

wird

if(strcmp(argv[1],"/1") == 0) {cout<<"go"<<endl;FirstRun();} 

Sie müssen string.h umfassen kann den strcmp Prototyp in den Code zu erhalten.

1

Eine weitere Option ist die C-Stil Argumente in eine viel freundlicher Vektor von Strings zu konvertieren und verarbeiten sie statt:

#include <string> 
#include <vector> 

typedef std::vector<std::string> parameter_list; 

int 
cpp_main(std::string const& program_name, parameter_list const& params) { 
    for (parameter_list::const_iterator arg=params.begin(); arg!=params.end(); ++arg) { 
     if (*arg == "/hide-icons") { 
     } else if (*arg == "/show-icons") { 
     } else if (*arg == "/reinstall") { 
      set_as_default(); 
     } else if (*arg == "/?") { 
      show_help(program_name); 
     } else if (*arg == "/1") { 
      first_run(); 
     } else { 
      show_help(program_name); 
     } 
    } 
    return 0; 
} 

int 
main(int argc, char **argv) { 
    return cpp_main(argv[0], parameter_list(&argv[1], &argv[argc])); 
} 
+0

Schöne Idee. Wenn Sie jedoch nicht auf ein Array außerhalb seiner Grenzen zugreifen, ist das Ergebnis undefiniert, obwohl es normalerweise so lange funktioniert, wie das Array nicht am Ende einer Speicherseite steht. try parameter_list (& argv [0] + 1, & argv [0] + argc) – iain

+0

Der Konstruktor hebt 'argv' niemals außerhalb seines Bereichs ab. Dies ist ein offener STL-Bereich, so dass er ab 'argv [1] 'kopiert und am Element vor' argv [argc]' endet. Denken Sie daran, dass 'end()' ist STL ist eigentlich der _ "Vergangenheit-am-Ende-Wert für den Container" _. Wenn der Container ein Array ist, ist dies das Element, das dem letzten Element des Arrays folgt. Es kann jedoch eine kleine Möglichkeit geben, dass die Adresse von "argv [argc]" (was berechnet wird) den Adressbereich überläuft, aber ich denke, der Standard bietet tatsächlich Schutz dagegen. –

Verwandte Themen