2010-01-04 227 views
2

我寫了下面的代碼,它不起作用,但是當我改變它時,第二個代碼段將會起作用。C++比較c字符串的問題

int main(int argc, char *argv[]) 
{ 
    if(argv[ 1 ] == "-i") //This is what does not work 
    //Do Something 
} 

但是,如果我寫這樣的代碼,這將工作。

int main(int argc, char *argv[]) 
{ 
    string opti = "-i"; 

    if(argv[ 1 ] == opti) //This is what does work 
    //Do Something 
} 

是因爲字符串類==作爲一個重載成員,因此可以執行此操作嗎?

在此先感謝。

+0

有使用STRCMP任何問題嗎?我只是想知道這樣做的好處... – rplusg 2010-01-04 06:29:35

+1

它看起來像你試圖閱讀命令行選項。如果您在Linux機器上,請查看getopt()函數http://linux.die.net/man/3/getopt – 2010-01-04 07:40:32

回答

11

是因爲字符串類==作爲一個超載成員,因此可以執行此操作?

你是對的。 char *類型的正則值沒有重載操作符。爲了比較C字符串,

if (strcmp(argv[1], "-i") == 0) { 
    ... 
} 

通過比較字符串你做(與==直接)的方式,你是比較值指針。由於"-i"是編譯時間常量,而argv[1]是別的,它們永遠不會相等。

+0

謝謝。 – user174084 2010-01-04 06:19:09

9

正確。當你做argv[1] == "-i"(在兩個char*表達式上使用==),你比較指針是否相等,而不是字符串中的字符。您必須使用strcmp函數來比較字符串數據。

std::string已重載運算符來檢查字符串==字符串,字符* ==字符串和字符串==字符*,但它不可能重載字符* ==字符*因爲它已經有一個定義的含義:比較指針。

1

這一個在C中可以正常工作。請記住檢查argc,以免發生seg故障。還有strncmp(),這是比較字符串的一種安全方法,因爲它會限制字符串的最大長度。

#include <string.h> 
#include <stdio.h> 

int main(int argc, char *argv[]) 
{ 
    if((argc > 1) && (strcmp(argv[1], "-i") == 0)) 
    { 
     printf("got -i\n"); 
    } 
} 

如果您傳遞多個PARAMS作爲命令選項檢查getopt()