2013-09-24 80 views
5

我想要做的是遍歷報價直到引用結尾/(*引號沒有任何內容)。我的代碼有效嗎?如何遍歷指針所創建的字符串

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

要切入點,'quote = 0'是不正確的。 – Zong

+0

爲什麼不使用'unsigned int'? – Recker

回答

11

您可能需要另一個指針來遍歷數組,否則對原始字符串的訪問將會丟失。

並且最好只使用NULL作爲指針。

請不要使用0作爲初始值,除非您想要使用索引(請參見下文)。

char *quote =只會讓quote指向只讀文字,而不是複製字符串。改爲使用char quote[] =

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

Test

使用指數:

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

您知道,由於字符串文字處於只讀頁面,這很可能會導致訪問衝突? – ChrisWue

+0

@ChrisWue哦,對,謝謝,修正。 – Dukeling

+0

@Dukeling: - 做char * quote =「是或不是....問題」;並採取另一個字符* quotePtr = quote;同樣的事情可以做..什麼是錯誤的採取char * quote =「是或不是......問題」... – kTiwari

0

你在你的for初始化,這是無效的,因爲你在*quote != NULL部分提領它會導致訪問衝突重新分配quote

語義上NULL'\0'是等價的,但語法上我更喜歡這個。請注意,通過使用這種方法,您可以保留一個指向字符串(的開頭)的指針。

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); 
} 

替代地使用索引:

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]); 
} 

(注意,如果quote值不是在編譯時已知的sizeof語義將改變)

+0

爲什麼重新分配然後解引用一個指針無效?你的代碼也是一樣的,所以大概你的理由是不正確的。 – Dukeling

+0

'wchar const_t * quote'是一個不可修改的常量字符串,因此您的代碼將失敗。 – ChrisWue

2

考慮此作爲擴展到由Dukeling提供的答案

當您使用

char *quote = "Hello World"; 

這使得只讀字符串,意味着您不能以更簡單的方式更改其內容。

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

如果您想更改字符串中的字符,使用數組是一個好習慣。

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.