Nói chung, mã này:
for (; *p; ++p) *p = tolower(*p);
không không
” hoạt động để làm giảm một trường hợp chuỗi trong c, khi p trỏ đến một chuỗi?
Nó không làm việc cho ASCII thuần túy, nhưng vì char
thường là một loại ký, và kể từ tolower
đòi hỏi một đối số không âm (trừ các giá trị đặc biệt EOF
), các mảnh nói chung sẽ có hành vi undefined.
Để tránh điều đó, đúc lập luận để unsigned char
, như thế này:
for (; *p; ++p) *p = tolower((unsigned char)*p);
Bây giờ nó có thể làm việc cho các bảng mã byte đơn như Latin-1, với điều kiện bạn đã thiết lập miền địa phương đúng qua setlocale
, ví dụ setlocale(LC_ALL, "");
. Tuy nhiên, lưu ý rằng mã hóa UTF-8 rất phổ biến không phải là một byte đơn trên mỗi ký tự. Để xử lý văn bản UTF-8, bạn có thể chuyển đổi nó thành chuỗi rộng và chữ thường.
chi tiết:
*p
là một biểu thức biểu thị đối tượng mà p
điểm đến, có lẽ là một char
.
Là một điều kiện tiếp tục cho for
vòng lặp, bất kỳ khác không char
giá trị mà *p
biểu, có tác dụng logic Đúng, trong khi không char
giá trị ở phần cuối của chuỗi có tác dụng logic False, kết thúc vòng lặp.
++p
tiến lên con trỏ để trỏ đến char
tiếp theo.
Nguồn
2015-06-05 07:19:37
Xin chào. tại sao bạn nghĩ nó không hoạt động? \ –
Bạn không hiểu phần nào? – juanchopanza
Xin chào, tôi không chắc chắn về cách * p có thể được sử dụng làm thông số thứ hai trong vòng lặp for và cách vòng lặp biết kết thúc – Dave