2013-04-18 10 views
-6

我目前正在學習如何處理命令行參數。我有一個程序需要調用另一個程序,都是用C++編寫的。我有一臺Windows電腦。這是程序我發現了一個新的範例:系統

#include "stdafx.h" 
#include <iostream> 
#include <sstream> 

using namespace std; 

void main() 
{ 
    char buffer[200]; 
    char arg1[6]="Hello"; 
    std::stringstream buffer; 
    sprintf(buffer, "C:\system.exe %i %i", arg1); 
    system(buffer);  

    system("pause"); 
} 

我需要調用下面的程序:

#include "stdafx.h" 
#include <iostream> 
#include <iomanip> 
#include <string> 

using namespace std; 

void main(int argc, char*argv[]) 
{  
    string baci;   
    for(int i = 1; i < argc; i++) 
     baci += argv[i]; 

    if (baci=="Hello") 
     cout << "Francesco, ti mando 4 baci !!!" << endl; 

    system("pause"); 
} 

這不是正確創建命令行,我想不通爲什麼。任何人都可以幫助並解釋爲了使系統可執行文件使用雙參數所需的任何變化嗎?書籍和網絡關於這個程序並不是很詳細。我覺得體面的只是這個,但我無法將其用於我的目的。 C++: How to use command line arguments

+0

你可以編輯你的問題,所以它更清楚你問什麼具體問題? –

+6

我會很感興趣,你怎麼想出這個問題的標題... – PlasmaHH

+0

我不確定你想要什麼。但是如果你想要第二個參數,你似乎想要'''sprintf(buffer,「C:\ system.exe%i%i%i」,arg1,arg1,arg2)'''。 –

回答

0

除了沒有編譯代碼之外,還有一些明顯的問題。首先在C++中沒有void main()這樣的東西。它必須返回一個int。第二個問題是您將buffer重新標記爲std::stringstream。第三個問題是,你正在通過值傳遞它作爲sprintf的第一個參數,因爲它既不是char*也不是指針傳遞,所以它不起作用。第四個問題是您試圖將參數展開爲整數值(%i)而不是C風格字符串(%s)。你也有兩個參數的格式說明符,但只能通過一個參數。這個結果是未定義的,第二個%i可以擴展到任何值。

你的代碼也許應該是這個樣子......

int main() 
{ 
    char buffer[200]; 
    char arg1[6]="Hello"; 
    sprintf(buffer, "C:\\system.exe %s", arg1); 
    system(buffer);  

    system("pause"); 

    return 0; 
} 

傳遞一個double作爲參數只是改變print specifier格式字符串。

double arg1 = 1.0f; 
    sprintf(buffer, "C:\\system.exe %lf", arg1); 

要傳遞一個以上的參數,你需要包括額外的格式說明和參數傳遞給sprintf

sprintf(buffer, "C:\\system.exe %s %s %i", arg1, arg2string, arg3int); 

你的第二個方案也有一個問題,我不認爲它會執行你期望的方式。正如托馬斯在他的評論中指出的那樣,你將這些論點連接在一起,然後進行比較。如果你執行它作爲system.exe hello there然後baci將是hello there這似乎是不正確的。由於您只想查看是否已發送Hello,因此您應該在循環中檢查它,而不是連接字符串。

void main(int argc, char*argv[]) 
{  
    for(int i = 1; i < argc; i++) 
     if (0 == strcmp(argv[i], "Hello")) 
      cout << "Francesco, ti mando 4 baci !!!" << endl; 

    system("pause"); 
} 
+0

另一個問題是:'baci + = argv [i];'它將連接所有參數之間沒有空格。我不認爲這是OP想要的。 –

+0

@ThomasMatthews不是他想要的。當我編輯他的問題時,我注意到了它。現在爲它添加一個註釋。 –

+0

@CaptainObvlious。對不起,但你的第一個例子不編譯。 「警告C4129:'s':無法識別的字符轉義序列」 – alwaystudent

相關問題