Разделить LPSTR и складывать значения как длинные - PullRequest
1 голос
/ 02 ноября 2011

Я пытаюсь взять LPSTR в C ++, такой как «12,30,57» и разделить его, а затем сложить все числа (все они не десятичные), которые возвращаются из операции разбиения в результирующий длинное значение.

Это не домашняя работа, я могу вас заверить. Я пишу для расширения, которое требует, чтобы я кодировал процедурные вещи на C ++, так как основная среда разработки не поддерживает функции. Я разработчик Java / C #, так что все это загадка. ПРИМЕЧАНИЕ. Это чистый C ++, а не C ++. NET. В конечном итоге мне также придется написать версию для Objective-C (о, радость), чтобы как можно больше соответствовать ANSI-C ++, и мне будет лучше.

ОТВЕТ

Я просто хотел поблагодарить всех за вашу помощь и поделиться с вами своим кодом, который прекрасно работает. Это довольно напряженно для меня, так как я на самом деле не парень C ++. Но спасибо всем.

// Get
long theparam = GetSomeLPSTR(); // e.g. pointer to "1,2,3,4,5,6"

// Set
char *temp = (LPSTR)theparam;
char *temp2 = (LPSTR)malloc(strlen(temp)+1);
strcpy(temp2,temp);

long result = 0;
char * pch;

// Split
pch = strtok(temp2,",");

// Iterate
while (pch != NULL)
{
    // Add to result
    result += atoi(pch);

    // Do it again
    pch = strtok (NULL,",");
}

// Return
return result;

Ответы [ 4 ]

1 голос
/ 02 ноября 2011

В идеальном мире, где у вас есть возможность повышения, вы можете сделать это:

#include <string>
#include <vector>
#include <boost/algorithm/string.hpp>
#include <boost/lexical_cast.hpp>
typedef char* LPSTR;

int total(LPSTR input)
{
    std::vector<std::string> parts;
    std::string inputString(input);
    boost::split(parts, inputString, boost::algorithm::is_any_of(","));
    int total = 0;
    for(size_t i = 0 ; i < parts.size() ; ++i)
        total += boost::lexical_cast<int>(parts[i]);

    return total;
}

Тот же код будет работать в Objective-C ++.

1 голос
/ 02 ноября 2011

Учитывая, что вам все равно нужно преобразовать подстроки в long, самое простое решение, вероятно, выглядит примерно так:

std::vector<long> results;
std::istringstream source(originalString);
long value;
while ( source >> value ) {
    results.push_back( value );
    char sep;
    source >> sep;
    if ( sep != ',' ) {
        source.setstate( std::ios_base::failbit );
    }
}
if ( ! source.eof() ) {
    //  Format error in input...
}
1 голос
/ 02 ноября 2011

один простой способ (их много, некоторые более или менее эффективны):

LPSTR urcstring = "12,30,57";
std::stringstream ss(urcstring);
long n,m,p; 
char comma;

ss >> n;
ss >> comma;
ss >> m;
ss >> comma;
ss >> p;

std::cout << "sum: " << ( n + m +p ) << std::endl;
0 голосов
/ 02 ноября 2011
// Get
long theparam = GetSomeLPSTR(); // e.g. pointer to "1,2,3,4,5,6"

// Set
char *temp = (LPSTR)theparam;
char *temp2 = (LPSTR)malloc(strlen(temp)+1);
strcpy(temp2,temp);

long result = 0;
char * pch;

// Split
pch = strtok(temp2,",");

// Iterate
while (pch != NULL)
{
    // Add to result
    result += atoi(pch);

    // Do it again
    pch = strtok (NULL,",");
}

// Return
return result;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...