2013-09-24 14 views
5

द्वारा बनाई गई स्ट्रिंग के माध्यम से लूप कैसे करें मैं उद्धरण के अंत तक उद्धरण के माध्यम से पुनरावृत्ति करना चाहता हूं/(* उद्धरण में इसमें कुछ भी नहीं है)। क्या मेरा कोड मान्य है?पॉइंटर

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

बिंदु पर कटौती करने के लिए, 'उद्धरण = 0' गलत है। – Zong

+0

क्यों 'हस्ताक्षरित int' का उपयोग नहीं करें? – Recker

उत्तर

11

आपको शायद सरणी को पार करने के लिए एक और सूचक की आवश्यकता है, अन्यथा आपकी मूल स्ट्रिंग तक पहुंच खो जाएगी।

और पॉइंटर्स के लिए अधिमानतः केवल NULL का उपयोग करें।

प्रारंभिक मान के रूप में 0 का उपयोग न करें, जब तक कि आप इसके बजाय इंडेक्स का उपयोग नहीं करना चाहते (नीचे देखें)।

char *quote = करना 0 स्ट्रिंग की प्रतिलिपि बनाने के बजाय केवल पढ़ने के लिए शाब्दिक 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

@ डिकलिंग: - कर * उद्धरण = "होना या नहीं .... प्रश्न"; और एक और char * quotePtr = उद्धरण लेना; वही काम किया जा सकता है .. 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]); 
} 

(ध्यान दें कि sizeof के शब्दों अगर quote का मूल्य संकलन समय पर नहीं जाना जाता है बदल जाएगा)

+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. 
संबंधित मुद्दे