Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C++

Kiểm tra chuỗi có phải số (numeric) trong C++

Kiểm tra xem một chuỗi (std::string) có chỉ chứa các chữ số 0-9 hay không. Cách đơn giản là duyệt từng ký tự và dùng std::isdigit().

Hàm kiểm tra cơ bản

#include <iostream>
#include <string>
#include <cctype>  // cho isdigit()

using namespace std;

bool isNumeric(const string& str) {
    if (str.empty()) return false;
    
    for (char c : str) {
        if (!isdigit(static_cast<unsigned char>(c))) {
            return false;
        }
    }
    return true;
}

int main() {
    string input;
    cout << "Nhap chuoi: ";
    cin >> input;
    
    if (isNumeric(input)) {
        cout << "Day la so nguyen" << endl;
    } else {
        cout << "Day KHONG phai so" << endl;
    }
}

Kết quả

Nhap chuoi: 5687
Day la so nguyen
Nhap chuoi: 584asS
Day KHONG phai so

Các trường hợp cần lưu ý

InputisNumeric()Ghi chú
"123"true
"-123"falseDấu '-' không phải digit
"+123"falseDấu '+' không phải digit
"12.34"falseDấu '.' không phải digit
" 123 "falseKhoảng trắng không phải digit
""falseChuỗi rỗng
"0"true

Mở rộng: Hỗ trợ số âm, số thực


bool isInteger(const string& s) {
    if (s.empty()) return false;
    size_t start = (s[0] == '-' || s[0] == '+') ? 1 : 0;
    if (start == s.size()) return false;  // Chỉ có dấu
    for (size_t i = start; i < s.size(); ++i) {
        if (!isdigit(static_cast<unsigned char>(s[i]))) return false;
    }
    return true;
}

bool isFloat(const string& s) {
    // Phức tạp hơn - có thể dùng stringstream hoặc regex
    // Xem phương pháp dưới
}

Phương pháp thay thế: stringstream


#include <sstream>

bool isNumber(const string& s) {
    stringstream ss(s);
    double d;
    char c;
    return (ss >> d) && !(ss >> c);  // Đọc được số và không còn ký tự thừa
}

Phương pháp C++17: std::from_chars (Hiệu năng cao nhất)


#include <charconv>

bool isIntegerFast(const string& s) {
    int value;
    auto result = std::from_chars(s.data(), s.data() + s.size(), value);
    return result.ec == std::errc{} && result.ptr == s.data() + s.size();
}

So sánh

Phương phápƯu điểmNhược điểm
Duyệt + isdigitĐơn giản, không phụ thuộc localeChỉ số nguyên dương
stringstreamHỗ trợ float, dấu, khoa họcChậm, phụ thuộc locale
std::from_chars (C++17)Nhanh nhất, không locale, không exceptionChỉ số nguyên/float cơ bản
RegexLinh hoạt patternRất chậm

Khuyến nghị

  • Chỉ kiểm tra chữ số 0-9: Duyệt + isdigit
  • Parse số thực tế: std::from_chars (C++17) hoặc strtod
  • Input người dùng phức tạp: stringstream hoặc regex