CÁC HÀM C / C++
CÁC CHỦ ĐỀ
BÀI MỚI NHẤT
MỚI CẬP NHẬT

Hàm strtol() và strtoul() trong C/C++

Trong lập trình C/C++, việc xử lý chuỗi là một phần quan trọng và phổ biến. Đối với các tác vụ như chuyển đổi chuỗi thành số nguyên hoặc số thực, các hàm như strtol()strtoul() đóng vai trò quan trọng. Trong bài viết này, mình sẽ tìm hiểu về hai hàm này và cách chúng hoạt động trong ngôn ngữ lập trình C/C++.

Hàm strtol() strtoul() cho phép chúng ta chuyển đổi một chuỗi thành số nguyên hoặc số nguyên không dấu tương ứng. Cả hai hàm đều cung cấp khả năng xử lý các cơ số khác nhau trong chuỗi đầu vào, đồng thời cũng cung cấp khả năng xử lý các trường hợp lỗi phổ biến như chuỗi không hợp lệ hoặc tràn số.

Trong bài này, mình sẽ đi vào chi tiết về cú pháp, cách sử dụng, xử lý lỗi và so sánh với các hàm tương tự. Cuối cùng, ta sẽ hiểu ví dụ minh họa và bài tập thực hành để hiểu rõ hơn về cách sử dụng strtol() strtoul() trong các tình huống thực tế.

Hàm strtol() trong C/C++

Hàm strtol() trong thư viện cstdlib của C++ được sử dụng để chuyển đổi chuỗi thành số nguyên dựa trên các cơ số khác nhau. Dưới đây là các phần cụ thể:

Cú pháp của hàm strtol()

Cú pháp của hàm strtol() như sau:

long strtol(const char* str, char** endptr, int base);

Trong đó:

  • str: Chuỗi cần chuyển đổi.
  • endptr: Con trỏ tới đầu của phần còn lại của chuỗi sau khi chuyển đổi. Nếu không muốn sử dụng, có thể truyền nullptr.
  • base: Cơ số của số nguyên được chuyển đổi, có thể là từ 2 đến 36 hoặc 0 để phân biệt cơ số tự định dạng từ chuỗi.

Cách sử dụng hàm strtol() để chuyển đổi chuỗi thành số nguyên dựa trên các cơ số

#include <cstdlib>
#include <iostream>
// Bài viết được đăng tại freetuts.net
int main() {
    const char* str = "12345";
    char* endptr;
    long num = strtol(str, &endptr, 10); // Chuyển chuỗi thành số nguyên với cơ số 10
    std::cout << "Chuỗi " << str << " sau khi chuyển đổi thành số nguyên: " << num << std::endl;
    return 0;
}

Điều chỉnh cách sử dụng hàm strtol() với các kiểu dữ liệu khác nhau

  • Sử dụng với kiểu dữ liệu int
#include <cstdlib>
#include <iostream>
// Bài viết được đăng tại freetuts.net
int main() {
    const char* str = "12345";
    char* endptr;
    int num = static_cast<int>(strtol(str, &endptr, 10)); // Chuyển chuỗi thành số nguyên kiểu int với cơ số 10
    std::cout << "Chuỗi " << str << " sau khi chuyển đổi thành số nguyên kiểu int: " << num << std::endl;
    return 0;
}
  • Sử dụng với kiểu dữ liệu long
#include <cstdlib>
#include <iostream>
// Bài viết được đăng tại freetuts.net
int main() {
    const char* str = "123456789";
    char* endptr;
    long num = strtol(str, &endptr, 10); // Chuyển chuỗi thành số nguyên kiểu long với cơ số 10
    std::cout << "Chuỗi " << str << " sau khi chuyển đổi thành số nguyên kiểu long: " << num << std::endl;
    return 0;
}

Xử lý trường hợp lỗi khi sử dụng hàm strtol()

  • Xử lý trường hợp chuỗi đầu vào không hợp lệ
#include <cstdlib>
#include <iostream>

int main() {
    const char* str = "abc123";
    char* endptr;
// Bài viết được đăng tại freetuts.net
    long num = strtol(str, &endptr, 10);
    if (*endptr != '\0') {
        std::cout << "Chuỗi " << str << " không hợp lệ." << std::endl;
    } else {
        std::cout << "Chuỗi " << str << " sau khi chuyển đổi thành số nguyên: " << num << std::endl;
    }
    return 0;
}
  • Xử lý trường hợp tràn số
#include <cstdlib>
#include <iostream>
#include <climits>

int main() {
    const char* str = "12345678901234567890"; // Số vượt quá giới hạn của kiểu long
    char* endptr;
// Bài viết được đăng tại freetuts.net
    long num = strtol(str, &endptr, 10);
    if ((num == LONG_MAX || num == LONG_MIN) && errno == ERANGE) {
        std::cout << "Chuỗi " << str << " vượt quá phạm vi của số nguyên." << std::endl;
    } else {
        std::cout << "Chuỗi " << str << " sau khi chuyển đổi thành số nguyên: " << num << std::endl;
    }
    return 0;
}

Trong các ví dụ trên, mình đã thấy cách sử dụng hàm strtol() để chuyển đổi chuỗi thành số nguyên với các kiểu dữ liệu khác nhau, cũng như cách xử lý các trường hợp lỗi phổ biến.

Hàm strtoul() trong C/C++

Hàm strtoul() trong thư viện cstdlib của C++ được sử dụng để chuyển đổi chuỗi thành số nguyên không dấu dựa trên các cơ số khác nhau. Dưới đây là các phần cụ thể:

Cú pháp của hàm strtoul()

Cú pháp của hàm strtoul() như sau:

unsigned long strtoul(const char* str, char** endptr, int base);

Trong đó:

  • str: Chuỗi cần chuyển đổi.
  • endptr: Con trỏ tới đầu của phần còn lại của chuỗi sau khi chuyển đổi. Nếu không muốn sử dụng, có thể truyền nullptr.
  • base: Cơ số của số nguyên không dấu được chuyển đổi, có thể là từ 2 đến 36 hoặc 0 để phân biệt cơ số tự định dạng từ chuỗi.

Cách sử dụng hàm strtoul()

Để chuyển đổi chuỗi thành số nguyên không dấu dựa trên các cơ số

#include <cstdlib>
#include <iostream>

int main() {
    const char* str = "12345";
    char* endptr;
// Bài viết được đăng tại freetuts.net
    unsigned long num = strtoul(str, &endptr, 10); // Chuyển chuỗi thành số nguyên không dấu với cơ số 10
    std::cout << "Chuỗi " << str << " sau khi chuyển đổi thành số nguyên không dấu: " << num << std::endl;
    return 0;
}

Điều chỉnh cách sử dụng hàm strtoul() với các kiểu dữ liệu khác nhau

  • Sử dụng với kiểu dữ liệu unsigned int
#include <cstdlib>
#include <iostream>

int main() {
    const char* str = "12345";
    char* endptr;
// Bài viết được đăng tại freetuts.net
    unsigned int num = static_cast<unsigned int>(strtoul(str, &endptr, 10)); // Chuyển chuỗi thành số nguyên không dấu kiểu unsigned int với cơ số 10
    std::cout << "Chuỗi " << str << " sau khi chuyển đổi thành số nguyên không dấu kiểu unsigned int: " << num << std::endl;
    return 0;
}
  • Sử dụng với kiểu dữ liệu unsigned long
#include <cstdlib>
#include <iostream>

int main() {
    const char* str = "123456789";
    char* endptr;
// Bài viết được đăng tại freetuts.net
    unsigned long num = strtoul(str, &endptr, 10); // Chuyển chuỗi thành số nguyên không dấu kiểu unsigned long với cơ số 10
    std::cout << "Chuỗi " << str << " sau khi chuyển đổi thành số nguyên không dấu kiểu unsigned long: " << num << std::endl;
    return 0;
}

Xử lý trường hợp lỗi khi sử dụng hàm strtoul()

  • Xử lý trường hợp chuỗi đầu vào không hợp lệ
#include <cstdlib>
#include <iostream>

int main() {
    const char* str = "abc123";
    char* endptr;
    unsigned long num = strtoul(str, &endptr, 10);
// Bài viết được đăng tại freetuts.net
    if (*endptr != '\0') {
        std::cout << "Chuỗi " << str << " không hợp lệ." << std::endl;
    } else {
        std::cout << "Chuỗi " << str << " sau khi chuyển đổi thành số nguyên không dấu: " << num << std::endl;
    }
    return 0;
}
  • Xử lý trường hợp tràn số
#include <cstdlib>
#include <iostream>
#include <climits>

int main() {
    const char* str = "12345678901234567890"; // Số vượt quá giới hạn của kiểu unsigned long
    char* endptr;
// Bài viết được đăng tại freetuts.net
    unsigned long num = strtoul(str, &endptr, 10);
    if (num == ULONG_MAX && errno == ERANGE) {
        std::cout << "Chuỗi " << str << " vượt quá phạm vi của số nguyên không dấu." << std::endl;
    } else {
        std::cout << "Chuỗi " << str << " sau khi chuyển đổi thành số nguyên không dấu: " << num << std::endl;
    }
    return 0;
}

Trong các ví dụ trên, mình đã thấy cách sử dụng hàm strtoul() để chuyển đổi chuỗi thành số nguyên không dấu với các kiểu dữ liệu khác nhau, cũng như cách xử lý các trường hợp lỗi phổ biến.

So sánh với các hàm tương tự trong C/C++

So sánh với hàm atoi() và atof()

So sánh với hàm atoi():

  • Hàm atoi() trong C/C++ được sử dụng để chuyển đổi một chuỗi thành một số nguyên.
  • Hàm strtoul() cũng thực hiện tương tự, nhưng nó hỗ trợ chuyển đổi các số nguyên không dấu và có thể xử lý các cơ số khác nhau.

Ví dụ:

#include <cstdlib>
#include <iostream>

int main() {
    const char* str = "123";
    int num1 = atoi(str); // Chuyển chuỗi thành số nguyên với atoi()
    unsigned long num2 = strtoul(str, nullptr, 10); // Chuyển chuỗi thành số nguyên không dấu với strtoul()
    // Bài viết được đăng tại freetuts.net
    std::cout << "Số nguyên từ chuỗi '" << str << "' sử dụng atoi(): " << num1 << std::endl;
    std::cout << "Số nguyên không dấu từ chuỗi '" << str << "' sử dụng strtoul(): " << num2 << std::endl;

    return 0;
}

So sánh với hàm atof()

  • Hàm atof() trong C/C++ được sử dụng để chuyển đổi một chuỗi thành một số thực.
  • Hàm strtoul() chuyển đổi chuỗi thành số nguyên không dấu.

Ví dụ:

#include <cstdlib>
#include <iostream>

int main() {
    const char* str = "123.45";
    double num1 = atof(str); // Chuyển chuỗi thành số thực với atof()
    unsigned long num2 = strtoul(str, nullptr, 10); // Chuyển chuỗi thành số nguyên không dấu với strtoul()
// Bài viết được đăng tại freetuts.net
    std::cout << "Số thực từ chuỗi '" << str << "' sử dụng atof(): " << num1 << std::endl;
    std::cout << "Số nguyên không dấu từ chuỗi '" << str << "' sử dụng strtoul(): " << num2 << std::endl;

    return 0;
}

So sánh với hàm sscanf()

  • Hàm sscanf() trong C/C++ được sử dụng để đọc các giá trị từ một chuỗi theo một định dạng đã cho.
  • Hàm strtoul() cũng có thể thực hiện việc chuyển đổi chuỗi thành số nguyên không dấu, nhưng sscanf() linh hoạt hơn vì nó cho phép bạn đọc các giá trị từ chuỗi theo các định dạng phức tạp hơn.

Ví dụ:

#include <cstdio>
#include <iostream>

int main() {
    const char* str = "123";
    unsigned long num1;
    unsigned long num2;

    // Sử dụng sscanf() để chuyển chuỗi thành số nguyên không dấu
    sscanf(str, "%lu", &num1);
// Bài viết được đăng tại freetuts.net
    // Sử dụng strtoul() để chuyển chuỗi thành số nguyên không dấu
    num2 = strtoul(str, nullptr, 10);

    std::cout << "Số nguyên không dấu từ chuỗi '" << str << "' sử dụng sscanf(): " << num1 << std::endl;
    std::cout << "Số nguyên không dấu từ chuỗi '" << str << "' sử dụng strtoul(): " << num2 << std::endl;

    return 0;
}

Ví dụ minh họa hàm strtol() và strtoul() trong C/C++

Ví dụ về cách sử dụng hàm strtol() và strtoul() trong các tình huống khác nhau

  • Ví dụ về sử dụng hàm strtol() để chuyển đổi chuỗi thành số nguyên với cơ số cụ thể:
#include <cstdlib>
#include <iostream>

int main() {
    const char* str = "12345";
    char* endptr;
    
    long num = strtol(str, &endptr, 10); // Chuyển chuỗi thành số nguyên với cơ số 10
// Bài viết được đăng tại freetuts.net
    if (endptr == str) {
        std::cerr << "Không thể chuyển đổi chuỗi thành số nguyên." << std::endl;
    } else if (*endptr != '\0') {
        std::cerr << "Chuỗi chứa ký tự không hợp lệ." << std::endl;
    } else {
        std::cout << "Số nguyên từ chuỗi '" << str << "' là: " << num << std::endl;
    }

    return 0;
}
  • Ví dụ về sử dụng hàm strtoul() để chuyển đổi chuỗi thành số nguyên không dấu:
#include <cstdlib>
#include <iostream>

int main() {
    const char* str = "12345";
    char* endptr;
    
    unsigned long num = strtoul(str, &endptr, 10); // Chuyển chuỗi thành số nguyên không dấu với cơ số 10
// Bài viết được đăng tại freetuts.net
    if (endptr == str) {
        std::cerr << "Không thể chuyển đổi chuỗi thành số nguyên không dấu." << std::endl;
    } else if (*endptr != '\0') {
        std::cerr << "Chuỗi chứa ký tự không hợp lệ." << std::endl;
    } else {
        std::cout << "Số nguyên không dấu từ chuỗi '" << str << "' là: " << num << std::endl;
    }

    return 0;
}

Bài tập thực hành

Viết các đoạn mã sử dụng hàm strtol() và strtoul() để chuyển đổi chuỗi thành số nguyên và số nguyên không dấu

  • Chuyển đổi chuỗi thành số nguyên:
#include <cstdlib>
#include <iostream>

int main() {
    const char* str = "12345";
    char* endptr;
    // Bài viết được đăng tại freetuts.net
    long num = strtol(str, &endptr, 10); // Chuyển chuỗi thành số nguyên với cơ số 10

    if (endptr == str) {
        std::cerr << "Không thể chuyển đổi chuỗi thành số nguyên." << std::endl;
    } else if (*endptr != '\0') {
        std::cerr << "Chuỗi chứa ký tự không hợp lệ." << std::endl;
    } else {
        std::cout << "Số nguyên từ chuỗi '" << str << "' là: " << num << std::endl;
    }

    return 0;
}
  • Chuyển đổi chuỗi thành số nguyên không dấu:
#include <cstdlib>
#include <iostream>

int main() {
    const char* str = "12345";
    char* endptr;
    // Bài viết được đăng tại freetuts.net
    unsigned long num = strtoul(str, &endptr, 10); // Chuyển chuỗi thành số nguyên không dấu với cơ số 10

    if (endptr == str) {
        std::cerr << "Không thể chuyển đổi chuỗi thành số nguyên không dấu." << std::endl;
    } else if (*endptr != '\0') {
        std::cerr << "Chuỗi chứa ký tự không hợp lệ." << std::endl;
    } else {
        std::cout << "Số nguyên không dấu từ chuỗi '" << str << "' là: " << num << std::endl;
    }

    return 0;
}

Kết bài

Trong bài viết này, mình đã tìm hiểu về hai hàm quan trọng trong ngôn ngữ lập trình C/C++, đó là strtol() strtoul(), được sử dụng để chuyển đổi chuỗi thành số nguyên và số nguyên không dấu tương ứng. Mình đã thảo luận về cú pháp và cách sử dụng của hai hàm này, cũng như xử lý các trường hợp lỗi phổ biến khi sử dụng chúng.

Ngoài ra, mình cũng đã so sánh hai hàm này với các hàm tương tự khác như atoi(), atof() sscanf(), để hiểu rõ hơn về ưu và nhược điểm của mỗi hàm.

Cuối cùng, qua các ví dụ minh họa và bài tập thực hành, mình đã áp dụng kiến thức đã học để sử dụng strtol() strtoul() trong các tình huống thực tế, từ đó nâng cao khả năng làm việc với chuỗi trong ngôn ngữ C/C++ của mình.

Hy vọng rằng bài viết này đã giúp bạn hiểu rõ hơn về hai hàm này và cách sử dụng chúng trong ứng dụng thực tế.

test php

Bài giải

-------------------- ######## --------------------

Câu hỏi thường gặp liên quan:

Cùng chuyên mục:

Các hàm xử lý mảng đa chiều (array.h) trong C/C++

Các hàm xử lý mảng đa chiều (array.h) trong C/C++

Các hàm xử lý ngày tháng (datetime.h) trong C/C++

Các hàm xử lý ngày tháng (datetime.h) trong C/C++

Các hàm xử lý số thực (float.h) trong C/C++

Các hàm xử lý số thực (float.h) trong C/C++

Các hàm xử lý số nguyên lớn (bigint.h) trong C/C++

Các hàm xử lý số nguyên lớn (bigint.h) trong C/C++

Các hàm xử lý thời gian (time.h) trong C

Các hàm xử lý thời gian (time.h) trong C

Thread Pools và Parallel Algorithms trong C++

Thread Pools và Parallel Algorithms trong C++

Tạo và quản lý các Multithreading trong C++

Tạo và quản lý các Multithreading trong C++

Xử lý ngoại lệ khi làm việc với Memory Allocation trong C++

Xử lý ngoại lệ khi làm việc với Memory Allocation trong C++

Try, Catch, và Throw của Exception Handling trong C++

Try, Catch, và Throw của Exception Handling trong C++

Cách sử dụng Lambda Expressions trong C++

Cách sử dụng Lambda Expressions trong C++

Sử dụng weak_ptr trong C++

Sử dụng weak_ptr trong C++

Sử dụng shared_ptr trong C++

Sử dụng shared_ptr trong C++

Sử dụng unique_ptr trong C++

Sử dụng unique_ptr trong C++

Tổng quan về Smart Pointers trong C++

Tổng quan về Smart Pointers trong C++

Sử dụng Iterators trong STL của C++

Sử dụng Iterators trong STL của C++

[Iterator] Sử dụng Vector trong C++

[Iterator] Sử dụng Vector trong C++

[Iterator] Sử dụng trong List trong C++

[Iterator] Sử dụng trong List trong C++

[STL] Sử dụng Vector trong C++

[STL] Sử dụng Vector trong C++

Tổng quan về Iterators trong C++

Tổng quan về Iterators trong C++

[STL] Các hàm thường dùng của lớp Vector trong C++

[STL] Các hàm thường dùng của lớp Vector trong C++

Top