Разделить LPSTR и сложить значения как длинный

#c #lpstr

#c #lpstr

Вопрос:

Я пытаюсь взять 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 resu<
 

Комментарии:

1. Вы имеете в виду, что у вас нет доступа к стандартным функциям, таким как strtok и тому подобное?

2. Это более чем многообещающе. Я действительно заставил это работать, но я не знаю, как преобразовать LPSTR в символ [] .

3. LPSTR это то же самое char * , что и семантически то же char [] самое, что и с точки зрения реальных программ.

4. LPSTR означает char* (в сборке, отличной от Unicode, предполагая, что вы не компилируете для 16-разрядного процессора), а char[] идентичен char * .

5. Отлично. Последняя проблема: как мне скопировать содержимое одного LPSTR в другой способом присваивания? Например. длинный указатель = GetSomeLPSTR(); LPSTR temp = <<Содержимое LPSTR указателя, но не указатель на указатель переменной

Ответ №1:

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

 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;
 

Комментарии:

1. Моя проблема в том, что я действительно не знаю, сколько # у меня будет. Таким образом, это изменит концепцию разделения.

Ответ №2:

В идеальном мире, где у вас есть boost, вы могли бы сделать это:

 #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 .

Ответ №3:

Учитывая, что вам все равно нужно преобразовать подстроки в 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...
}
 

Ответ №4:

 // 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 resu<