2012-04-17 30 views
1

換句話說,是否有辦法在單個字符串中捕獲整個命令行(甚至是命令行的參數部分),包括所有分隔符?C中是否有%*或Environment.CommandLine的等價物?

我明確不尋找涉及連接argv元素的解決方案。 這樣的解決方案假定有關分隔符或參數的格式。

例如,讓我們下面的程序:

#include <stdio.h> 

int main(int argc, char** argv){ 
    int i; 
    for (i = 0; i < argc; i++) 
     puts(argv[i]); 
} 

如果我運行它,就像這樣:

Test.exe 1 2 

我得到的輸出:

Test.exe 
1 
2 

這不是一個問題,但是當我像這樣運行它時:

Test.exe "1" "2" 

而且我得到完全相同的輸出,這是一個問題。基本上,我試圖獲取作爲命令行發佈的逐字字符串。

+1

爲什麼你有C#列爲標籤? – 2012-04-17 17:57:42

+0

Environment.CommandLine是對C#的引用。 – merlin2011 2012-04-17 18:02:45

+0

如果您使用Windows,請使用'GetCommandLine'。這不是便攜式的。 – asveikau 2012-04-17 18:40:04

回答

0

int main (int argc, char** argv)

的argc是參數計數,argv已被parameterers。我相信他們是空間劃定的。

如果你想合併它們在一個字符串中可以這樣做:(原諒我,如果它寫得不好)。

#include <sstream> 
#include <string> 
// -------- 
std::stringstream S; 
for (int i = 0; i < argc; ++i) 
    S << argv[i]; 

std::string Str = S.str(); 

您可能還想在合併時在它們之間添加空格,但是,除了調試目的,我認爲它不會太多用處。直接使用它們或放入vector<string>通常是最方便的方法。

哦,沒有意識到(我總是犯這個錯誤),它應該是純粹的C.在這種情況下,就讓他們保持原樣。如果有人在C++中使用它,我不會刪除上面的代碼。

0

您可以使用環境屬性的一個

Environment.CommandLine 
+0

我的錯誤,請忽略這一點。我沒有意識到你問了C – RajN 2012-04-17 18:00:16

3

有C中沒有內置的方法來檢索命令行(或參數)作爲一個字符串的所有報價不變,至少沒有定義按語言標準。問題的部分是argv數組的定義,它的一部分是你的shell確實之前來傳遞參數給程序的內容(如去掉引號):

5.1.2.2.1計劃啓動
...
- 如果 argc值大於零,陣列成員 argv[0]通過 argv[argc-1]包容應包含指向字符串, 其通過編程啓動之前的主機環境給出 實現定義的值。 意圖是向程序提供從程序啓動 之前確定的來自託管環境中的其他地方的信息。如果主機環境是不能夠 在大寫和小寫字母串供應,實施 應確保字符串用小寫接收。

重點煤礦。

There 可能是特定於平臺的擴展程序,它將按照您的要求進行操作,但我個人不知道。

0

Unix - 這裏C顯示它的unix起源 - 有一個參數的概念,而不是命令行的概念。命令行由shell分析,將它們分解爲參數,程序僅查看參數。

在具有命令行概念的系統上,可以將命令行作爲第一個參數並讓程序解析它們。大多數C實現不會這樣做 - 至少在默認情況下 - 它們會從命令行分割它們自己的參數。

根據你的情況下,您可以:

  • 接受了C方法是Unix的方式不要試圖強迫別的東西;
  • 重建一個命令行(但你必須要注意報價);
  • 使用依賴於系統的方式來獲得進入未解析命令行,如果有一個。

如果你想要可移植性,第一種可能是最好的,如果你不得不遵守你的實現爲參數分裂提供的不同約定,那麼最好是最好的。

0

C和C++實際上甚至沒有命令行的概念。該程序僅在mainargv參數中獲得其參數。這些如何完成取決於實施。

在Windows上,您可以撥打GetCommandLine。您的程序實際上已在main開始之前調用該程序,因爲這是Windows程序首先完成填充argv陣列的任務的一部分。

在Unix和Linux上,在程序開始運行之前,命令行會被解析並分解。命令行參數被傳遞給exec family of functions

如果您需要閱讀逐字命令的跨平臺和便攜式方式,我建議您從文件中讀取它們,而不是命令行。命令行受命令解釋器(如bash或cmd.exe)的按摩。

相關問題