2011-10-08 85 views
0

我試過memcpy/strncpy/std :: copy,但它們都沒有工作,導致程序崩潰。從字符數組中提取字符串

這裏就是我需要做的:

我試圖解析來自例如用戶輸入arguements。 「消息-add 0xAE」

我需要的0xAE部分提取到一個整數,繼承人一些僞代碼 _Input將持有滿弦「消息-add 0xAE」

if(strstr(_input,"message -add 0x")){ 
    char* _temp; 
    std::copy(strlen("message -add 0x"),strlen("message -add 0x")+(strlen(_input)-strlen("message -add 0x")),_temp); 
    /* or */ 
    memcpy(_temp,_input+strlen("message -add 0x"),strlen(_input)-strlen("message -add 0x")); 
    int _value = (int)_temp; 
    CLog->out("\n\n %d",_value); 
} 

編輯:感謝艾倫!

if(strstr(_input,"message -add 0x")){ 
      char* _temp = new char[strlen(_input)-strlen("message -add 0x")]; 
      memcpy(_temp,_input+strlen("message -add 0x"),strlen(_input)-strlen("message -add 0x")); 
      int _value = atoi(_temp); 
      CLog->out("\n\n %d",_value); 
} 
+0

我看不到代碼的一部分,你試圖將一個字符串轉換爲整數 –

+2

_temp將不會被初始化。 –

+0

雖然你不想使用任何第三方代碼,因此排除了所有優秀的解析器,但你自己嘗試這樣做的嘗試很可能會以許多缺陷結束。爲什麼你想重塑這個特定的輪子?解析選項非常困難。除非你是一個高度熟練的開發人員,否則你應該很樂意使用可用的第三方代碼。 –

回答

1

你是否在尋找:

int value = 0; 
char c; 
for(int i = strlen("message -add 0x"); c = *(_input + i); i++) { 
    value <<= 4; 
    if(c > '0' && c <= '9') { 
     // A digit 
     value += c - '0'; 
    } else if(c >= 'A' && c < 'G') { 
     // Hexadecimal 
     value += 10 + c - 'A'; 
    } 
} 

+0

它無法正常工作。如果我輸入消息-add 0x1 ..它返回203或其他東西。 –

+1

@minitech看起來像你忘了初始化值爲0 –

+0

將無法​​正常工作;值未初始化。當它是十六進制時,您也將輸入視爲十進制。 –

1

如果您想使用C++,那麼請避開各種C函數和所有討厭的內存管理。我會建議閱讀Accelerated C++。它確實是一本學習C++和實際使用C++的頂尖書籍。這裏還有一個問題的解決方案,而不C字符串分析例程:

#include <iomanip> 
#include <iostream> 
#include <sstream> 
#include <string> 


int 
main() 
{ 
    std::string const TARGET("message -add 0x"); 
    char const _input[] = "message -add 0xAE23"; 

    std::string input(_input); 
    std::string::size_type offset = input.find(TARGET); 
    if (offset != std::string::npos) { 
     std::istringstream iss(input); 
     iss.seekg(offset + TARGET.length()); 
     unsigned long value; 
     iss >> std::hex >> value; 
     std::cout << "VALUE<" << value << ">" << std::endl; 
    } 

    return 0; 
}