3
votes

Comment convertir un vecteur en un nombre entier

J'ai un vecteur avec ['6' '0' '0' '0' '0'] d'un utilisateur saisissant 60 000. J'ai besoin d'un int 60000 pour pouvoir manipuler ce nombre.

Je suis nouveau dans le C ++ et la programmation en général. J'ai lu les données / numéros de 60 000 à 3 500 000 à partir d'un port série et j'ai besoin d'un nombre entier, la seule façon dont j'ai réussi à le faire et à l'imprimer est via std :: vector. J'ai essayé de faire du vecteur mais cela me donne des nombres géniaux.

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

J'ai besoin d'une sortie de 60000 non pas dans un vecteur mais plutôt sous forme de nombre solide, toute aide serait appréciée merci .


4 commentaires

Double possible de convertir le vecteur de caractère en un entier


Qu'attendiez-vous de rxBuf [0 - dwRead] ? Il y a un grave malentendu qui doit être corrigé. Pensez-vous que cela équivaut aux tranches de liste de Python?


Pourquoi ne pas ignorer le vecteur et faire std :: string rxBuf (15, 0); et l'utiliser à la place?


Votre problème n'a vraiment pas grand-chose à voir avec le vecteur, car un vecteur stocke ses données dans une mémoire contiguë, pas différent d'un tableau de char . Ainsi, la réponse serait la même si vous demandiez "comment puis-je convertir un tableau de caractères en int "


5 Réponses :


5
votes

Bouclez sur les éléments d'un std :: vector et construisez un int à partir d'eux:

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


2 commentaires

Pas aussi éloquent que certaines autres réponses, mais fait le travail.


J'aime cela plus que d'autres réponses car il ne repose ni sur std :: string ni sur std :: stoi - pas d'allocation de mémoire ou de vérification inutile. Bien que je préfère std :: uint32_t au lieu de int .



9
votes

À partir de cette réponse , vous pouvez faire quelque chose comme :

int output = std::stoi(str);
    std::cout << output << "\n";

Pour convertir votre vecteur en chaîne.

Après cela, vous pouvez utiliser le fonction std :: stoi :

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


1 commentaires

Remarque: si la chaîne vectorielle est toujours terminée par null, vous pouvez utiliser std :: stoi (rxBuf.data ()) directement.



3
votes

Utilisez une chaîne std :: string pour construire votre chaîne:

int i = std::stoi(istr);

Ensuite, utilisez std :: stoi pour convertir en entier; std :: stoi

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


0 commentaires

3
votes

C ++ 17 a ajouté le std :: from_chars fonction qui peut faire ce que vous voulez sans modifier ni copier le vecteur d'entrée:

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';
}

Démo en direct


0 commentaires

2
votes

Pour minimiser le besoin de variables temporaires, utilisez un std :: string avec la longueur appropriée comme tampon.

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


0 commentaires