Trong lập trình C, chuyển đổi chuỗi thành số nguyên là một công việc thường gặp, đặc biệt khi làm việc với dữ liệu nhập từ người dùng hoặc từ các tệp văn bản. Một trong những hàm hữu ích cho nhiệm vụ này là strtol(). Hàm này không chỉ giúp chuyển đổi chuỗi thành số nguyên mà còn cho phép bạn xác định cơ số cho quá trình chuyển đổi, điều này rất quan trọng khi làm việc với các hệ đếm khác nhau như thập phân, bát phân, hoặc thậm chí là thập lục phân.
Cơ bản về hàm strtol()
strtol() là viết tắt của "string to long", tức là chuyển đổi từ chuỗi ký tự thành số kiểu long int. Nguyên mẫu của hàm này được định nghĩa trong thư viện tiêu chuẩn <stdlib.h>
. Cú pháp của hàm như sau:
long int strtol(const char *str, char **endptr, int base);
Trong đó:
str
: Là con trỏ đến chuỗi cần chuyển đổi.endptr
: Là con trỏ tới một con trỏ có thể được sử dụng để lưu địa chỉ của ký tự đầu tiên sau ký tự số cuối cùng trong chuỗi.base
: Là cơ số của hệ đếm (có giá trị từ 2 đến 36).
Sử dụng strtol()
-
Chuyển đổi chuỗi thập phân thành số nguyên: Đối với hệ đếm thập phân, chỉ cần truyền giá trị cơ số là 10. Ví dụ:
#include <stdio.h> #include <stdlib.h> int main() { const char *str = "12345"; char *end; long int num; num = strtol(str, &end, 10); printf("Số nguyên: %ld\n", num); return 0; }
-
Chuyển đổi chuỗi thập lục phân thành số nguyên: Đối với hệ thập lục phân, giá trị cơ số là 16.
#include <stdio.h> #include <stdlib.h> int main() { const char *str = "7F"; char *end; long int num; num = strtol(str, &end, 16); printf("Số nguyên: %ld\n", num); return 0; }
-
Chuyển đổi chuỗi bát phân thành số nguyên: Đối với hệ bát phân, giá trị cơ số là 8.
#include <stdio.h> #include <stdlib.h> int main() { const char *str = "77"; char *end; long int num; num = strtol(str, &end, 8); printf("Số nguyên: %ld\n", num); return 0; }
Kiểm tra lỗi và việc sử dụng endptr
Hàm strtol() có thể gặp nhiều lỗi như chuỗi không hợp lệ hoặc giá trị số vượt quá giới hạn của kiểu dữ liệu long int
. Do đó, cần phải kiểm tra giá trị endptr
và lỗi:
- Nếu giá trị của
*endptr
bằngstr
, điều đó có nghĩa là không có thành phần số hợp lệ nào được tìm thấy trong chuỗi. - Hàm strtol() cũng đặt giá trị của biến toàn cục
errno
để chỉ ra nếu xảy ra lỗi chuyển đổi (ví dụ như tràn số).
Ví dụ minh họa kiểm tra lỗi:
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <limits.h>
int main() {
const char *str = "123abc";
char *end;
long int num;
errno = 0; // Xóa lỗi trước khi thực hiện chuyển đổi
num = strtol(str, &end, 10);
if (errno == ERANGE && (num == LONG_MAX || num == LONG_MIN)) {
perror("Tràn số");
} else if (end == str) {
printf("Không tìm thấy số hợp lệ\n");
} else if (*end != '\0') {
printf("Có ký tự không hợp lệ trong chuỗi: %s\n", end);
} else {
printf("Số nguyên: %ld\n", num);
}
return 0;
}
Kết luận
Hàm strtol() cung cấp một phương pháp linh hoạt và mạnh mẽ để chuyển đổi chuỗi thành số nguyên với cơ số tùy chọn trong lập trình C. Việc hiểu rõ cách sử dụng và xử lý các tình huống lỗi sẽ giúp lập trình viên tạo ra những chương trình đáng tin cậy và hiệu quả hơn.
Comments