Извлечение строки из массива символов - PullRequest
0 голосов
/ 08 октября 2011

Я пробовал memcpy / strncpy / std :: copy, но ни один из них, похоже, не работает, что приводит к сбою программы.

Вот что мне нужно сделать:

Янапример, пытается проанализировать аргументы из пользовательского ввода."message -add 0xAE"

мне нужно извлечь часть 0xAE в целое число, вот какой-то псевдокод _input будет содержать полную строку "message -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);
}

Ответы [ 2 ]

1 голос
/ 08 октября 2011

Если вы хотите использовать C ++, держитесь подальше от различных функций C и всего этого неприятного управления памятью.Я бы порекомендовал прочитать Ускоренный 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;
}
1 голос
/ 08 октября 2011

Вы ищете:

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';
    }
}

...