Как преобразовать вектор <char>в целое число - PullRequest
3 голосов
/ 09 июля 2019

У меня есть вектор с ['6' '0' '0' '0' '0'] от пользователя, который вводит 60 000.Мне нужен int 60000, чтобы я мог манипулировать этим числом.

Я новичок в c ++ и программировании в целом.Я читаю данные / числа из 60 000–3 500 000 из последовательного порта, и мне нужно целое число, единственный способ, которым я успешно это сделал и распечатал, это через std :: vector.Я пытался сделать вектор, но он дает мне забавные числа.

#include "SerialPort.h"
std::vector<char> rxBuf(15);
DWORD dwRead;
while (1) {
  dwRead = port.Read(rxBuf.data(), static_cast<DWORD>(rxBuf.size()));
  // this reads from a serial port and takes in data
  // rxBuf would hold a user inputted number in this case 60,000
  if (dwRead != 0) {
    for (unsigned i = 0; i < dwRead; ++i) {
      cout << rxBuf[i];
      // this prints out what rxBuf holds
    }
    // I need an int = 60,000 from my vector holding [ '6' '0' '0' '0 '0']
    int test = rxBuf[0 - dwRead];
    cout << test;
    // I tried this but it gives me the decimal equivalent of the character
    numbers
  }
}

Мне нужен вывод 60000 не в векторе, а в виде сплошного числа, любая помощь будет оценена спасибо.

Ответы [ 5 ]

8 голосов
/ 09 июля 2019

Из этого ответа вы можете сделать что-то вроде:

std::string str(rxBuf.begin(), rxBuf.end());

Чтобы преобразовать ваш вектор в строку.

После этого вы можете использовать функцию std :: stoi :

int output = std::stoi(str);
    std::cout << output << "\n";
5 голосов
/ 09 июля 2019

Обведите элементы std::vector и создайте из них int:

std::vector<char> chars = {'6', '0', '0', '0', '0'};

int number = 0;

for (char c : chars) {
    number *= 10;
    int to_int = c - '0'; // convert character number to its numeric representation
    number += to_int;
}

std::cout << number / 2; // prints 30000
3 голосов
/ 09 июля 2019

C ++ 17 добавлена ​​функция std::from_chars, которая может делать то, что вы хотите, без изменения или копирования входного вектора:

std::vector<char> chars = {'6', '0', '0', '0', '0'};
int number;
auto [p, ec] = std::from_chars(chars.data(), chars.data() + chars.size(), number);
if (ec != std::errc{}) {
    std::cerr << "unable to parse number\n";
} else {
    std::cout << "number is " << number << '\n';
}

Live Demo

3 голосов
/ 09 июля 2019

Используйте std :: string для построения вашей строки:

std::string istr;
char c = 'o';
istr.push_back(c);

Затем используйте std :: stoi для преобразования в целое число; std :: stoi

int i = std::stoi(istr);
2 голосов
/ 09 июля 2019

Чтобы минимизировать потребность во временных переменных, используйте std::string с соответствующей длиной в качестве буфера.

#include "SerialPort.h"
#include <string>

std::string rxBuf(15, '\0');
DWORD dwRead;

while (1) {
    dwRead = port.Read(rxBuf.data(), static_cast<DWORD>(rxBuf.size()));

    if (dwRead != 0) {
        rxBuf[dwRead] = '\0'; // set null terminator
        int test = std::stoi(rxBuf);
        cout << test;
    }
}
...