Wie Sie feststellen, ob eine Zeichenkette eine Zahl in C++ ist

Jinku Hu 12 Oktober 2023
  1. Verwenden Sie die Methode std::isdigit, um festzustellen, ob eine Zeichenkette eine Zahl ist
  2. Verwenden Sie std::isdigit mit std::ranges::all_of, um zu bestimmen, ob eine Zeichenkette eine Zahl ist
  3. Verwenden Sie die Methode find_first_not_of, um zu bestimmen, ob ein String eine Zahl ist
Wie Sie feststellen, ob eine Zeichenkette eine Zahl in C++ ist

Dieser Artikel erklärt, wie Sie herausfinden können, ob eine bestimmte C++-Zeichenkette eine Zahl ist. Bevor wir einsteigen, sei darauf hingewiesen, dass die folgenden Methoden nur mit Einzelbyte-Zeichenketten und dezimalen ganzzahligen Zahlen kompatibel sind.

Verwenden Sie die Methode std::isdigit, um festzustellen, ob eine Zeichenkette eine Zahl ist

Die erste Version ist wahrscheinlich der naheliegendste Weg zur Umsetzung der Lösung. Nämlich, eine Zeichenkette als Parameter an eine Funktion isNumber zu übergeben, die über jedes einzelne char in der Zeichenkette iteriert und mit der Methode isdigit prüft. Wenn sie die erste Nicht-Nummer findet, gibt die Funktion false zurück. Wenn keine gefunden wird, wird true zurückgegeben.

#include <iostream>

using std::cin;
using std::cout;
using std::endl using std::string;

bool isNumber(const string& str) {
  for (char const& c : str) {
    if (std::isdigit(c) == 0) return false;
  }
  return true;
}

int main() {
  string str1 = "231524randstr23";
  string str2 = "23152423";
  string str3 = "a3152423";

  isNumber(str1) ? cout << "Number\n" : cout << "Not number\n";
  isNumber(str2) ? cout << "Number\n" : cout << "Not number\n";
  isNumber(str3) ? cout << "Number\n" : cout << "Not number\n";

  return EXIT_SUCCESS;
}

Ausgabe:

Not number
Number
Not number

Beachten Sie, dass wir das Urteil über jede Zeichenkette über einen ternären Bedingungsoperator ausgeben, der eine prägnante Variante des if-else ist.

Verwenden Sie std::isdigit mit std::ranges::all_of, um zu bestimmen, ob eine Zeichenkette eine Zahl ist

Die vorherige Methode war recht einfach für das mächtige C++, also lassen Sie uns eine eloquentere Lösung implementieren, indem wir die C++20-Methode std::ranges::all_of und einige Lambda-Ausdrücke verwenden. In unserem Fall prüft ranges::all_of, ob das angegebene Lambda für jedes Element des gegebenen Bereichs s.begin(), s.end() true zurückgibt und gibt true zurück, wenn die Bedingung erfüllt ist.

#include <algorithm>
#include <iostream>

using std::cin;
using std::cout;
using std::endl using std::string;

bool isNumber(const string& s) {
  return std::ranges::all_of(s.begin(), s.end(),
                             [](char c) { return isdigit(c) != 0; });
}

int main() {
  string str1 = "231524randstr23";
  string str2 = "23152423";
  string str3 = "a3152423";

  isNumber(str1) ? cout << "Number\n" : cout << "Not number\n";
  isNumber(str2) ? cout << "Number\n" : cout << "Not number\n";
  isNumber(str3) ? cout << "Number\n" : cout << "Not number\n";

  return EXIT_SUCCESS;
}

Verwenden Sie die Methode find_first_not_of, um zu bestimmen, ob ein String eine Zahl ist

Diese Version verwendet einen eingebauten string-Suchalgorithmus. Der Algorithmus sucht nach dem ersten Zeichen, das keinem der Zeichen in der als Argument übergebenen Zeichenkette entspricht (in unserem Fall - "0123456789"). Wenn das Zeichen nicht gefunden wird, wird string::npos zurückgegeben, also das Ergebnis des Vergleichs von isNumber.

#include <iostream>

using std::cin;
using std::cout;
using std::endl using std::string;

bool isNumber(const string& str) {
  return str.find_first_not_of("0123456789") == string::npos;
}

int main() {
  string str1 = "231524randstr23";
  string str2 = "23152423";
  string str3 = "a3152423";

  isNumber(str1) ? cout << "Number\n" : cout << "Not number\n";
  isNumber(str2) ? cout << "Number\n" : cout << "Not number\n";
  isNumber(str3) ? cout << "Number\n" : cout << "Not number\n";

  return EXIT_SUCCESS;
}
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

Verwandter Artikel - C++ String