Привет, у меня возникли проблемы с попыткой преобразовать строку чисел, например: 100 101 102, в (stoul) динамически выделяемое целое число без знака; ожидается, что я могу получить доступ к номеру за номером в виде массива на входе переменной длины.
#include <iostream>
#include <new>
#include <string> //Memset
int console(){
std::string console_buffer;
unsigned long int* integersConverted = NULL;
unsigned int integersNumberOf = 0;
for( ; ; ){
std::getline(std::cin, console_buffer);
integersConverted = console_defaultSyntaxProcessing(console_buffer, &integersNumberOf);
std::cout << "Found the following integers from conversion: ";
for(unsigned int debug_tmp0 = 0; debug_tmp0 < integersNumberOf; debug_tmp0++){
std::cout << integersConverted[debug_tmp0] << " ";
std::cout << std::endl;
}
delete integersConverted;
integersConverted = NULL;
}
return 0;
}
unsigned long int* console_defaultSyntaxProcessing(std::string console_buffer, unsigned int* integersNumberOfUpdate){
*integersNumberOfUpdate = 0;
unsigned int integersNumberOf = 0;
unsigned long int* integersFound = NULL;
integersFound = new unsigned long int(sizeof(unsigned long int) * 1024);
std::size_t stringPosition = 0;
for( ; stringPosition < console_buffer.length() && integersNumberOf < 1024; ){
integersFound[integersNumberOf] = std::stoul(console_buffer, &stringPosition, 10); //10 = Decimal
integersNumberOf++;
}
*integersNumberOfUpdate = integersNumberOf;
return integersFound;
}
Я получаю правильное значение, если ввожу только одно число, но весь массив 1024 печатается, если я ввожу два числа или более, и все позиции получают первое целое число. Я пытался вручную установить функцию std::string в константу, обнулить console_buffer.length(), чтобы она нашла '\ 0' и т. д.; к сожалению не получилось..
ОБНОВЛЕНИЕ --- через 5 минут после первого сообщения в теме; Проблема в том, как ответил Яшас, в console_defaultSyntaxProcessing для цикла; stoul &stringPosition возвращает количество прочитанных символов, а не позицию std::string. Другая проблема с использованием stoul заключается в том, что если я ввожу 100 ( 101, это не работает, поэтому следует фиксированному коду, но не должен использоваться. Как предложил Ламанди, вместо этого используйте std::stringstream.
std::size_t stringPosition = 0;
std::size_t stringPositionSum = 0;
for( ; stringPosition < console_buffer.length() && integersNumberOf < 1024; ){
try{
integersFound[integersNumberOf] = std::stoul(&console_buffer[stringPositionSum], &stringPosition, 10);
integersNumberOf++;
stringPositionSum = stringPositionSum + stringPosition;
}
catch(std::exception& exception){
break;
} //This catch will be used constantly by this buggy code.