преобразование строки (из substr) в unsigned int - PullRequest
0 голосов
/ 29 февраля 2012

У меня есть строка, которая на самом деле содержит число и строку, разделенные ,, например "12,fooBar".

Я хотел бы поместить его в разделенные переменные, то есть число в unsigned int myNum и строку в std::string myStr.

У меня есть следующий фрагмент кода:

size_t pos1=value.find(',');
std::cout << value.substr(0, pos1) << " and " 
          << (value.substr(0, pos1)).c_str() << std::endl;

Это дает 12 and 1. Что-нибудь, что я пропустил здесь? Что случилось с 2 во второй части?

Примечание : Я изолировал проблему от этого фрагмента кода. Мне нужно c_str(), чтобы передать его atoi, чтобы получить unsigend int. Здесь я не хочу печатать вторую часть.

Обновление : Я на самом деле получаю строку из levelDB Get. Если я поставлю тестовую строку, как я положил здесь, это работает.

Ответы [ 4 ]

5 голосов
/ 29 февраля 2012

Отправленный код создает ту же подстроку: value.substr(0, pos1).Обратите внимание, что std :: string :: substr () не изменяет объект, но возвращает новый std::string.

Пример:

#include <iostream>
#include <string>

int main ()
{
    std::string value ="12,fooBar";
    unsigned int myNum;
    std::string myStr;

    const size_t pos1 = value.find(',');    
    if (std::string::npos != pos1)
    {
        myNum = atoi(value.substr(0, pos1).c_str());
        myStr = value.substr(pos1 + 1);
    }

    std::cout << myNum << " and " 
              << myStr << std::endl;

    return 0;
}

Вывод:

12 и fooBar

РЕДАКТИРОВАТЬ:

Если unsigned int является единственной требуемой частью, то будет работать следующее:

unsigned int myNum = atoi(value.c_str());

как atoi() остановится на первом нецифровом символе (исключая необязательный начальный символ - или +), в этом случае ,.

3 голосов
/ 29 февраля 2012

Самым чистым решением этой проблемы в стиле C ++ является использование потока строк.

#include <sstream>
// ...
std::string value = "12,fooBar";
unsigned int myNum;
std::string myStr;
std::stringstream myStream(value);
myStream >> myNum;
myStream.ignore();
myStream >> myStr;
0 голосов
/ 25 ноября 2018

Еще одним вариантом является использование функции std :: from_chars из 17-го стандарта (заголовок ):

int x;
from_chars(&s[i], &s.back(), x); // starting from character at index i parse
                                // the nearest interger till the second char pointer

Существуют различные перегрузки для различных типов значений x (двойной и т. д.).

0 голосов
/ 29 февраля 2012

Ваш второй подстрок должен быть value.substr (pos1 + 1, value.length ())

...