konvertieren von string zu size_t
Gibt es einen Weg, um zu konvertieren std::string
zu size_t
?
Das problem ist, dass size_t
ist zuverlässige Plattform geben (es ist zwar das Ergebnis der sizeof
). Also, ich kann nicht garantieren, dass die Umwandlung von string
zu unsigned long
oder unsigned int
wird es richtig machen.
BEARBEITEN:
Ein einfacher Fall ist:
std::cout<< "Enter the index:";
std::string input;
std::cin >> input;
size_t index=string_to_size_t(input);
//Work with index to do something
- Was meinst du mit konvertieren
string
zusize_t
sind Sie versuchen, zu konvertieren einen string von Ziffern? Poste bitte etwas code und erklären, was du fragst - Haben Sie einen Blick auf en.cppreference.com/w/cpp/string/basic_string/stol
- Was hindert jemanden, der aus der Eingabe eine riesige Zahl, die größer als Ihre numerische Grenzen?
- Dies ein weiteres problem. Für jetzt ist es ein stol-wie Verfahren, dass die Arbeit für size_t
- Was ist das problem mit nur tun
size_t index; cin >> index;
? - ist es eine echte überlastung size_t mit >> ? sehen Bathseba Antwort und Kommentare
- Da
size_t
ist nur ein Typ-alias zu einem der integralen Typen, ja, es ist.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie
%zd
als Formatbezeichner in einerscanf
-Typ-Ansatz.Oder verwenden Sie eine
std::stringstream
wird überlastet>>
zusize_t
.operator >>
fürstd::size_t
. Siehe hier.size_t
außer dort, wo es definiert ist, dass es ist ein vorzeichenloser ganzzahliger Typ, der Rückgabetyp dersizeof()
, und hat einen maximalen Wert (SIZE_MAX
) von nicht weniger als 65535.Den Sie verwenden möchten, können
sscanf
mit der%zu
Planer, die fürstd::size_t
.Haben Sie einen Blick hier.
Wörtlich, ich bezweifle, dass es eine überladene
operator >>
vonstd::basic_istringstream
fürstd::size_t
. Sehen hier.%Iu
Planer, aber ich entwickle auf einem für ein Windows-system. Siehe Arbeiten mit dem Typ size_t in den Funktionen prinft, scanf und ähnlichen Funktionenkönnen Sie
std::stringstream
Lassen Sie uns davon ausgehen, für eine minute, dass
size_t
ist ein typedef auf einen bestehenden integer, d.h. die gleiche Breite wie entwederunsigned int
,unsigned long
oderunsigned long long
.ANMUTIGEN es könnte eine separate (noch größer) geben, so weit wie die standard-Formulierung betrifft, aber ich halte das für sehr unwahrscheinlich.
Arbeiten mit, die Annahme, dass
size_t
ist nicht größeren alsunsigned long long
entweder stoull oder strtoull mit der anschließenden Besetzung zusize_t
funktionieren sollte.Aus der gleichen Annahme (
size_t
definiert, im Hinblick entwederunsigned long
oderunsigned long long
), es würde einoperator>>
überlast für diesen Typ.%zd
: das ist schon seit dem C99-standard. Nicht sicher über C++ aber ich glaube, es ist schon fort die gleiche Menge an Zeit.*scanf()
Familie. Ich bin zufällig auf realisiert Sie, so ist es nicht, eine Abneigung-aus-Unwissenheit, sondern ganz im Gegenteil. Ich könnte verwenden Sie Sie in eine Prise, aber Sie sehen mich nie empfehlen Sie niemandem, vor allem nicht in einem C++ - Kontext. 😉*scanf()
. Die Zusammenfassung ist, dass der Eingabe-string"0xz"
, wenn analysiert durch*scanf()
ist ein matching failure'x'
...) - es sei denn natürlich, Sie betrachten, eine nicht-konforme Implementierung wie glibc-2.8 oder newlib 1.14. 😉 Das ist nur ein Sache, die mich verabscheuen*scanf()
. 😉Durch die Nutzung der iss.fail(), die Sie überprüfen Fehler.
Anstelle von ("a"), verwenden Sie den Wert, den Sie konvertieren möchten.