strtol
cung cấp cho bạn sự linh hoạt hơn, vì nó thực sự có thể cho bạn biết nếu toàn bộ chuỗi được chuyển thành số nguyên hay không. atol
, khi không có khả năng chuyển đổi chuỗi thành một số (như trong atol("help")
), trả về 0, đó là không thể phân biệt từ atol("0")
:
int main()
{
int res_help = atol("help");
int res_zero = atol("0");
printf("Got from help: %d, from zero: %d\n", res_help, res_zero);
return 0;
}
Đầu ra:
Got from help: 0, from zero: 0
strtol
sẽ chỉ định, sử dụng endptr
đối số của nó , nơi chuyển đổi không thành công.
int main()
{
char* end;
int res_help = strtol("help", &end, 10);
if (!*end)
printf("Converted successfully\n");
else
printf("Conversion error, non-convertible part: %s", end);
return 0;
}
Đầu ra:
Conversion error, non-convertible part: help
Vì vậy, đối với bất kỳ chương trình nghiêm túc, chắc chắn tôi khuyên bạn sử dụng strtol
. Đó là một chút khó khăn hơn để sử dụng nhưng điều này có một lý do chính đáng, như tôi đã giải thích ở trên.
atol
có thể chỉ phù hợp cho các trường hợp rất đơn giản và được kiểm soát.
Nguồn
2010-09-25 05:54:57
Tôi tin rằng trong ví dụ của bạn, điều kiện nên là 'if (! * End)'. Nó sẽ trỏ đến null-terminator của chuỗi (nếu nó đã được chuyển đổi tất cả) nhưng sẽ không được thiết lập để NULL chính nó. –
@ Jeff M: bạn nói đúng, xin lỗi typo –
Liệu logic này có áp dụng cho hàm kernel linux 'simple_strtol'? Tôi không thể nhận được điều kiện 'if (! * End)' để đánh giá đúng, sử dụng mô hình chính xác của bạn. –