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