2013-09-24 110 views
5

Điều tôi muốn làm là lặp lại thông qua báo giá cho đến cuối báo giá/(* trích dẫn không có gì trong đó). Mã của tôi có hợp lệ không?Cách lặp qua một chuỗi được tạo bởi con trỏ

char *quote = "To be or not to be, that is the question."; 
for (quote = 0; *quote != NULL; quote++){ 
*quote = tolower(*quote); 
} 
+3

Để cắt thành điểm, 'quote = 0' không chính xác. – Zong

+0

Tại sao không sử dụng 'unsigned int'? – Recker

Trả lời

11

Bạn có thể cần một con trỏ khác để đi qua mảng, nếu không truy cập vào chuỗi ban đầu của bạn sẽ bị mất.

Và tốt nhất chỉ nên sử dụng NULL cho con trỏ.

Không sử dụng 0 làm giá trị ban đầu, trừ khi bạn muốn sử dụng chỉ mục thay thế (xem bên dưới).

Làm char *quote = sẽ chỉ cần thực hiện quote điểm đến chữ chỉ đọc, thay vì sao chép chuỗi. Sử dụng char quote[] = để thay thế.

char quote[] = "To be or not to be, that is the question."; 
char *quotePtr; 
for (quotePtr = quote; *quotePtr != '\0'; quotePtr++){ 
    *quotePtr = tolower(*quotePtr); 
} 

Test.

Sử dụng chỉ số:

char quote[] = "To be or not to be, that is the question."; 
int i; 
for (i = 0; quote[i] != '\0'; i++){ 
    quote[i] = tolower(quote[i]); 
} 

Test.

+1

Bạn biết rằng điều này rất có thể xảy ra với vi phạm quyền truy cập do chuỗi chữ trong một trang chỉ đọc? – ChrisWue

+0

@ChrisWue Oh đúng, cảm ơn, đã sửa. – Dukeling

+0

@Dukeling: - làm char * quote = "có hoặc không .... câu hỏi"; và lấy một trích dẫn khác * quotePtr = quote; cùng một điều có thể được thực hiện .. những gì sai với việc char * quote = "được hay không ... câu hỏi" ... – kTiwari

0

Bạn chỉ định lại quote trong bộ khởi tạo for, không hợp lệ và sẽ gây ra vi phạm quyền truy cập vì bạn bỏ qua nó trong phần *quote != NULL.

Semantically NULL'\0' tương đương, nhưng cú pháp tôi thích điều này. Lưu ý rằng bằng cách sử dụng phương pháp này, bạn giữ một con trỏ đến (bắt đầu) chuỗi.

wchar const_t* quote = L"To be or not to be, that is the question."; 

for(wchar_t* c = quote; *c != '\0'; c++) { 

    *c = tolower(*c); 
} 

cách khác sử dụng một chỉ số:

wchar const_t quote[] = L"To be or not to be, that is the question."; 

for(size_t i = 0; i < sizeof(quote); i++) { 

    quote[i] = tolower(quote[i]); 
} 

(lưu ý rằng ngữ nghĩa của sizeof sẽ thay đổi nếu giá trị của quote không biết tại thời gian biên dịch)

+0

Tại sao gán lại sau đó dereferencing một con trỏ không hợp lệ? Mã của bạn cũng vậy, vì vậy có lẽ lý do của bạn không chính xác. – Dukeling

+0

'wchar const_t * quote' là một chuỗi ký tự không đổi mà bạn không thể sửa đổi để mã của bạn không thành công. – ChrisWue

2

Hãy xem xét điều này như một mở rộng để câu trả lời được đưa ra bởi Dukeling

Khi bạn sử dụng

char *quote = "Hello World"; 

Điều này tạo chuỗi chỉ đọc, có nghĩa là bạn không thể thay đổi nội dung của nó theo cách đơn giản hơn.

Here *quote points to 'H' 
BUT, you cannot do *quote = 'A'; 
This will give you an error. 

Nếu bạn muốn thay đổi ký tự trong chuỗi, bạn nên sử dụng mảng.

char quote[] = "Hello World"; 
Here also *quote points to 'H' 
BUT, in this case *quote = 'A' is perfectly valid. 
The array quote will get changed.