Chuyển đổi phụ thuộc vào ý định: giá trị ASCII của ký tự, hay giá trị số mà ký tự đại diện (vd: '5' → 5).
C - 3 phương pháp
1. Type casting (Lấy mã ASCII)
char c = 's'; int ascii = (int)c; // 115 (mã ASCII của 's')
2. atoi() - Chuỗi số → int
#include <stdlib.h>
const char* str = "12345";
int val = atoi(str); // 12345
// Lỗi: atoi("abc") = 0 (không phân biệt được 0 hợp lệ và lỗi)
3. sscanf() - An toàn hơn, parse từ chuỗi
#include <stdio.h> const char* str = "12345"; int val; sscanf(str, "%d", &val); // Trả về số item parsed (1 nếu thành công)
Ví dụ C đầy đủ
#include <stdio.h>
#include <stdlib.h>
int main() {
const char* str = "12345";
char c = 's';
int x, y, z;
sscanf(str, "%d", &x); // 12345
y = atoi(str); // 12345
z = (int)c; // 115 (ASCII 's')
printf("sscanf: %d\n", x);
printf("atoi: %d\n", y);
printf("cast: %d\n", z);
return 0;
}
Kết quả
sscanf: 12345 atoi: 12345 cast: 115
C++ - 2 phương pháp hiện đại
1. stoi() - String → int (C++11)
#include <string>
std::string s = "45";
int x = std::stoi(s); // 45
// Overload với base và index
size_t pos;
int val = std::stoi("100abc", &pos, 10); // val=100, pos=3
2. Type casting (ASCII value)
char c = 's'; int ascii = static_cast(c); // 115
3. C++17: std::from_chars (Hiệu năng cao, no exception)
#include <charconv>
#include <string_view>
std::string_view sv = "12345";
int value;
auto result = std::from_chars(sv.data(), sv.data() + sv.size(), value);
if (result.ec == std::errc()) {
// Thành công, value = 12345
}
Bảng so sánh
| Phương pháp | Input | Output | Error handling | Ghi chú |
|---|---|---|---|---|
| (int)c | char | ASCII code | N/A | Luôn thành công |
| atoi() | const char* | int | Trả 0 (mơ hồ) | C legacy |
| sscanf() | const char* | int* | Return count | C standard |
| stoi() | string | int | Throw exception | C++11 |
| from_chars | char* | int& | error_code | C++17, fastest |