2009-08-16 39 views
0

我一直在我的c + +程序中比較麻煩。這是煮熟的版本。在c + +中的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; 
} 

當我運行「programname.exe/1」時,我的程序寫入「2args」而不是「去」。我錯過了明顯的東西嗎?

+0

是的,你是.... – Tom 2009-08-16 00:35:23

回答

18

argv[1]char*,所以用==測試你檢查,如果指針指向同一個地方,你正在使用的各種常量字符串的開始......這不會是這種情況。若要比較內容,請使用strcmp

+3

或者,如果你想要的參數是stricmp不區分大小寫 – 2009-08-16 00:16:16

+1

或者strncmp如果你只想測試前n個字符。 – 2009-08-16 00:18:46

+2

'stricmp()'不是標準的。 Chere沒有真正的標準C(或C++,據我所知 - 請問一個真正的C++程序員)做一個不區分大小寫的字符串比較的方法。 GCC提供了strcasecmp,VC++提供了stricmp ... – 2009-08-16 00:20:03

5

問題是,您的代碼比較指向字符串的指針,而不是指針本身。

您必須將調用替換爲字符串比較函數。

E.g.

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

成爲

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

您可能必須包含string.h中得到的strcmp原型到您的代碼。

1

另一種選擇是C風格的參數轉換成字符串的一個更友好的載體,而是對其進行處理:

#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

好主意。但是,不應該在數組邊界之外訪問數組,但結果是未定義的,儘管只要數組不在一頁內存的末尾,它就會工作。嘗試parameter_list(&argv [0] + 1,&argv [0] + argc) – iain 2009-08-16 13:38:55

+0

構造函數絕不會在其範圍外引用'argv'。這是一個STL開放範圍,因此它從'argv [1]'開始複製,並在'argv [argc]'之前的元素結束。請記住,'end()'是STL實際上是_「容器的最終值」_。如果容器是一個數組,那麼這是數組最後一個元素之後的元素。然而,'argv [argc]'(計算的)地址溢出地址範圍的可能性很小,但我認爲標準實際上也提供了對這種情況的保護。 – 2009-08-20 21:27:10