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 .
5 Réponses :
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
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 .
À 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());
Remarque: si la chaîne vectorielle est toujours terminée par null, vous pouvez utiliser std :: stoi (rxBuf.data ()) directement.
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);
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';
}
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;
}
}
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
vecteuret fairestd :: 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 enint"