2016-09-13 56 views
1

C++讀取輸入我剛剛學習C++,並試圖編寫一個程序,該程序將從char* argv[]中接收輸入並處理它們。char * argv []

每個argv[]將是6個十六進制,例如, 1A2B3C

我有一個char陣列 - char message[3]

,我試圖把1Amessage[0]2Bmessage[1],並3Cmessage[2]

我理解argv是一種像一個二維數組,所以如果我的命令行是:

./test 2 1A2B3C 4D5E6F

argv[2][0]會給我 '1' 和argv[2][1]會給我'A'

但我不知道如何閱讀2 char在一起,並將它們放入char陣列。

任何人都可以指向正確的方向嗎?

+0

查看互聯網上的一些基本教程。應該有很多如何讀取命令行參數。 – Hayt

+3

目前,忘了'argv'。以'const char input [] =「1A2B3C」開頭;'編寫一些代碼,試圖做你正在尋找的東西。如果您遇到問題,請發佈該代碼。一旦你得到了這個工作,你可以處理'argv'增加的複雜性。 –

+0

建議:使用'std :: string'它會真的簡化你的代碼;) – Garf365

回答

3

如果主函數聲明如下

int main(int argc, char *argv[]) 

調用

./test 1A2B3C 4D5E6F

將導致argv數組看起來類同

enter image description here

argv中

  • 第一條目總是路徑和可執行名稱,例如「/ home/user/test」(圖片僅顯示測試以保持簡單)
  • 其餘條目是命令行參數(本例中爲「1A2B3C」和「4D5E6F」)。
  • argv中的每個條目是反過來的字符數組

所以對於例如

  • 的argv [1] = [ '1', 'A', '2', 'B' , '3', 'C', '\ 0']

要從參數

  • 轉換每個參數爲字符串(標準:: STRI提取子串NG S(的argv [1]),它很容易與字符串工作比使用char *
  • 提取子串(s.substr(0,2))
  • 每個子字符串轉換爲一個整數(strtol(substring,NULL,16)

嘗試這個示例代碼

#include <iostream> 
#include <stdlib.h> //required for string to int conversion 

int main(int argc, char *argv[]) { 

    std::cout << "executable= " << argv[0] << std::endl; 

    for (int i=1; i<argc; i++) { 
    std::string s(argv[i]); //put char array into a string 

    std::cout << "arg["<<i<<"]="<<s<<std::endl; 

    for (int j=0; j<6; j+=2) { 

     std::string byteString = s.substr(j, 2); 

     char byte = (char) strtol(byteString.c_str(), NULL, 16); 

     std::cout << "byteString= "<<byteString << " as integer= "<<(int)byte<<std::endl; 
    } 
    } 
} 

調用 「./test 1A2B3C 4D5E6F」 輸出

executable= /home/user/test 
arg[1]=1A2B3C 
byteString= 1A as integer= 26 
byteString= 2B as integer= 43 
byteString= 3C as integer= 60 
arg[2]=4D5E6F 
byteString= 4D as integer= 77 
byteString= 5E as integer= 94 
byteString= 6F as integer= 111 

備選地,如果命令行參數可能已經被分割,即

"./test 1A 2B 3C 4D 5E 6F" 

可避免的子串的提取。