2009-01-14 63 views
3

好的,我試圖讓參數在小測試應用程序中正常工作。我的代碼如下。我在C++方面經驗不足,所以我不確定爲什麼當我使用-print(或--print)啓動測試時會自動聲明「Not a valid option」,然後結束。命令行參數不起作用 - 完全跳過它們

#include <iostream> 

int main(int argc, char* argv[]) 
{ 
    int option; 
    option = 1; 
    char* argument; 
    argument = argv[option]; 
    while (option < argc) 
    { 
     if (argument == "-print") 
     { 
      std::cout << "Printing Extra Text"; 
     } 
     else 
     { 
      std::cout << "Not a valid option" << std::endl; 
     } 
     option++; 
    } 
    std::cout << "Printing normal text" << std::endl; 
    return 0; 
} 

我是對的嗎?提前致謝。

回答

12

您正在比較字符串「-print」的內存地址與內存地址argument。這不行!使用strcmp()來比較字符串值。相反的:

if (argument == "-print") 

if (strcmp(argument, "-print") == 0) 
1
if (argument == "-print") 

你不能比較喜歡這個字符串!

使用strcmp()比較字符串。

8

下面一行是錯誤的:

if (argument == "-print") 

在這裏,我們比較指針,不是字符串值。替換爲:

if (strcmp(argument, "-print") == 0) 

關於字符串處理,C/C++的行爲與Java或C#不同。字符串不是本地類型或對象,而只是指向字符數組的指針。

或者,如果您的選項列表變得更復雜,請考慮使用專用選項解析庫,如BoostProgram_options。它將處理所有方面,包括驗證和用戶消息。

2

它已經有一段時間,我在C++編程,但不應該只是一個使用

std::string argument; 

,然後用==比較會的工作?

1

你的問題表明你也想測試--print(兩個破折號),但你的代碼不檢查。

此外,你在循環外部分配參數,你會想在循環內部做到這一點,否則你只會在循環中每次測試參數#1。

1

當讀到參數時,還有另一個問題。 (需要更改)

int main(int argc, char* argv[]) 
{ 
    int option; 
    option = 1; 
    char* argument; 
    while (option < argc) 
    { 
     argument = argv[option]; 
     if (strcmp(argument, "-print") == 0) 
     { 
      std::cout << "Printing Extra Text"; 
     } 
     else 
     { 
      std::cout << "Not a valid option" << std::endl; 
     } 
     option++; 
    } 
    std::cout << "Printing normal text" << std::endl; 
    return 0; 
}