Zazwyczaj nie trzeba znać kodów ASCII każdego znaku:
if ((liczbaString[i] < '0') || (liczbaString[i] > '9')) {
W cctype jest wiele funkcji sprawdzających czy dany znak jest cyfrą, małą literą, dużą literą etc:
if (std::isdigit(liczbaString[i])) { // zwróci true badź false
Można sobie zmniejszyć ryzyko pomyłki znaku czy kodu ascii ;)
Jeżeli wymagasz tylko liczby dodatnie można też zrobić to tak:
#include <iostream>
#include <string>
#include <algorithm>
#include <cctype>
int main() {
std::string str;
do {
std::cout << "Podaj łańcuch znaków reprezentujący liczbę naturalną: ";
std::cin >> str;
} while (!std::all_of(str.begin(), str.end(), [](unsigned char i) { return std::isdigit(i); } )); // tak długo jak każdy element str nie będzie cyfrą
std::cout << "Podano: " << str << "\n";
}
Jeżeli nie to łap inne przykłady na przyszłość:)
#include <iostream>
#include <limits>
int main() {
std::cout << "Podaj liczbę: ";
int number;
while (!(std::cin >> number))
{
std::cin.clear();
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
std::cerr << "Podano nieprawidłową wartość typu int.\n"
<< "Spróbuj jeszcze raz: ";
}
std::cout << "Udało się wczytać: " << number << "\n";
}
Włącz w swoim kompilatorze C++11. Chociaż dla wygodnych konwersji string -> int(std::to_string), int -> string(std::stoi - rzuca wyjątek gdy nie będzie możliwa konwersja) itp. Przykład:
#include <iostream>
#include <string>
int main() {
std::string inputs[6] =
{
"ala ma kota",
"asdgff7892345",
"8577890asdf",
"3425724389057234890570892358",
"-1",
"-1234.234"
};
for (int i = 0; i < 6; ++i) {
int number;
std::cout << "|" << inputs[i] << "|";
try {
number = std::stoi(inputs[i]);
std::cout << " zamieniono na liczbę |" << number << "|\n";
} catch (...) {
std::cout << " - nie można zamienić.\n";
}
}
}