2011-10-08 63 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; 
}