Bất cứ ai có một ý tưởng những gì tôi đang làm sai
strlen()
trả về một size_t
, mà là một kiểu dữ liệu integer unsigned. -1
được hiểu là một số nguyên không dấu là một giá trị lớn, vì vậy nó kết thúc bằng cách lớn hơn độ dài của chuỗi của bạn. Bạn có thể sử dụng cờ -Wsign-compare
trong gcc
và một số trình biên dịch khác để cảnh báo bạn khi bạn cố so sánh các giá trị đã ký và chưa ký.
Ngoài ra, không có ý nghĩa gì khi so sánh độ dài của chuỗi với -1
. Độ dài không bao giờ có thể âm; nó là luôn luôn sẽ là 0
trở lên. Vì vậy, có thể bạn sẽ muốn viết lại mã của mình để kiểm tra theo số 0
hoặc thực hiện đúng cách bất kỳ điều kiện nào bạn đang cố gắng kiểm tra.
if(-1<strlen(str)) printf("The size of the string is %d", strlen(str));
Trong mã này, bạn có thể hợp lý mong đợi những thử nghiệm để luôn thành công và printf()
để thực hiện, vì chiều dài luôn là 0
trở lên. Nhưng bạn thấy rằng thử nghiệm thực sự không thành công và printf()
không bao giờ xảy ra vì -1
được thăng hạng thành unsigned để nó có thể được so sánh với size_t
. Các giải pháp dễ dàng là để loại bỏ hoàn toàn điều kiện: bạn biết thử nghiệm sẽ luôn thành công, vì vậy không cần thiết cho nó. Chỉ cần loại bỏ các if
*:
printf("The size of the string is %zu", strlen(str));
* Ngoài ra, thay đổi sự xác định định dạng in từ %d
để %zu
vì, như Matt McNabb đã chỉ ra trong một chú thích, bạn đang cố gắng in một size_t
.
giá trị đầu ra của 'strlen (str)' là gì? – sasquatch
Có thể là nó trả về giá trị unsigned và phá vỡ mọi thứ –
nó là tốt để bật cảnh báo để tối đa cài đặt trên trình biên dịch của bạn –