2015-06-05 14 views
5

Tôi khá mới để lập trình và đã chỉ tự hỏi tại sao bởi mã này:Làm thế nào để "for (; * p; ++ p) * p = tolower (* p);" làm việc trong c?

for (; *p; ++p) *p = tolower(*p); 

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?

+0

Xin chào. tại sao bạn nghĩ nó không hoạt động? \ –

+1

Bạn không hiểu phần nào? – juanchopanza

+0

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

Trả lời

2

Để tháo đường may, chúng ta hãy giả p là một con trỏ đến một char và ngay trước khi for vòng lặp, nó trỏ tới ký tự đầu tiên trong một chuỗi.

Trong C, các chuỗi thường được mô hình hóa bởi một tập hợp các giá trị liền kề char với số 0 cuối cùng được thêm vào cuối hoạt động như null terminator.

*p sẽ đánh giá là 0 khi chuỗi null-terminator đạt được. Sau đó, vòng lặp for sẽ thoát. (Biểu thức thứ hai trong vòng lặp for hoạt động như kiểm tra kết thúc).

++p tiến tới ký tự tiếp theo trong chuỗi.

*p = tolower(*p) đặt ký tự đó thành chữ thường.

+0

Ah đó là bit tôi không biết, vì vậy theo mặc định điều kiện của vòng lặp for là nếu tham số thứ hai là 0 thì nó sẽ thoát? – Dave

+0

Thật vậy, biểu thức thứ hai trong vòng lặp 'for' là kiểm tra kết thúc. – Bathsheba

3

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.

+0

Đây là tất cả một chút về phía trước của tôi, nhưng tôi sẽ cố gắng và ngồi xuống để hiểu nó, cổ vũ! – Dave

+0

+1 cho là cầu kỳ (tốt, đặc biệt là trong C) và để đề cập đến mã hóa, chỉ vì vậy các OP giữ trong tâm trí họ đang xung quanh. – dummydev

Các vấn đề liên quan