2012-11-24 242 views
1
#include <iostream> 
#include <cstdlib> 
#include <sstream> 
#include <fstream> 
using namespace std; 

    int main(int argc, char* argv[]) 
    { 
    cout << argv[1] << endl; 
    if (argv[1]=="-r") cout << "success\n"; 
    } 

「成功」不打印出來。當我運行:$ ./hearts -r 散發出來的唯一的事情是:命令行選項

-r

這使我的sooo困惑

+0

你不能用'=='來比較字符串,歡迎來到'C' /'C++'; D的世界歡迎來到SO以及漂亮的配置文件圖片:) – LihO

回答

1

你應該嘗試使用:

if (strcmp(argv[1],"-r")==0) cout << "success\n"; 

來比較字符串字面的說法。

1

你可能想strcmp兩個字符串進行比較。對於==爲true,您的兩個字符串必須指向相同的內存位置,因爲"-r"是編譯時常量,所以不會發生這種情況。

2

這是因爲您在兩個指針上使用==。它將檢查指針是否相等,而不是相同數據上的點。

要比較兩個C字符串,使用strcmp這樣的:

if (strcmp(argv[1], "-r") == 0) 
1

您應該使用strcmp()如預期它會奏效。當你使用==時你比較指針,它們不能相同。

1

在C中,字符串是字符數組(指向字符序列的指針)。在你的代碼中,相等運算符只是比較兩個完全不同的指針值。您應該使用strcmp功能,或者使用string類:

#include <iostream> 
#include <cstdlib> 
#include <sstream> 
#include <fstream> 
#include <cstring> // <-- here 

using namespace std; 

int main(int argc, char* argv[]) 
{ 
    cout << argv[1] << endl; 
    if (strcmp(argv[1], "-r") == 0) // <-- and here 
     cout << "success\n"; 
} 

OR

#include <iostream> 
#include <cstdlib> 
#include <sstream> 
#include <fstream> 
#include <string> // <-- here 

using namespace std; 

int main(int argc, char* argv[]) 
{ 
    cout << argv[1] << endl; 
    if (string(argv[1]) == "-r") // <-- and here 
     cout << "success\n"; 
} 
+0

In * C *,「strings are just ..「,但由於std :: string是* C++ *中的核心.. – 2012-11-24 20:02:19

+0

@pst你說得對。謝謝。 –

3

我要繼續前進,告訴你,你不想strcmp。 C++的方式來處理命令行參數是要儘快把他們變成std::string S作爲可能的:

int main(int argc, const char* argv[]) 
{ 
    // Make a vector of all command-line arguments 
    std::vector<std::string> args(argv, argv+argc); 
    // Now we can use std::string's operator== 
    if (args.size() > 1 && args[1] == "-r") { 
    std::cout << "Success" << std::endl; 
    } 
    return 0; 
} 

您可以用==操作比較兩個std::string秒。在args[1] == "-r"的情況下,將const char[]字符串文字轉換爲std::string以供比較。在您的代碼中,argv[1]=="-r"會比較兩個不相等的獨立指針 - 它不會比較C風格字符串的內容。

+0

然後我要告訴你,你不需要'std :: endl'。只需使用''\ n''來代替(它甚至更短!)。而對於選項解析,你可能想要像'getopt',而不是手動'if' /'else'檢查。 – melpomene

+0

@melpomene但'\ n'不會刷新流。 –

+0

它確實如果'cout'是一個終端。此外,這裏並不重要,因爲程序即將退出,這會刷新所有流。 – melpomene