2013-06-12 15 views
6

मैंने सी में स्ट्रिंग को रिवर्स करने के लिए निम्न कोड लिखा है। कोड ठीक से काम करता प्रतीत होता है और इसलिए मैं उलझन में हूं। क्या किसी को पता है कि यहां कोई त्रुटि क्यों नहीं है? मैं लूप के लिए सीमाओं या अनंत लूप से बाहर की सरणी की अपेक्षा कर रहा था, लेकिन ऐसा लगता है कि यह लूप टूट जाता है इससे पहले कि यह नकारात्मक मानों में हो।चार ऐरे - क्यों लूप अनंत नहीं है?

#include <stdio.h> 
#include <string.h> 

void reverse(char* str); 

void reverse(char* str) 
{ 
    size_t len = strlen(str); 

    for(int i = (int)len-1; i<=len; i--) 
    { 
     printf("%c", str[i]); 
    } 
} 

int main (int argc, const char * argv[]) 
{ 
    char string[] = {'h', 'e', 'l', 'l', 'o', '\0'}; 
    reverse(string); 

    return 0; 
} 
+0

'उत्पादन के लिए (int i = (int) लेन-1; i> = 0; मैं -)' क्या तार्किक रूप से सही है। आपके पास जो था, वह सच होगा जबकि 'i'' len' से कम है, जो हमेशा सत्य होता है। –

+0

हस्ताक्षरित/हस्ताक्षरित तुलना मूर्खतापूर्ण है। http://stackoverflow.com/a/5416498/489590 –

+4

@ ऐसा करें? जो उसके सवाल का जवाब नहीं देता है, यह उसके लिए क्यों काम कर रहा है, हम सभी जानते हैं कि यह ठीक से कैसे किया जाता है – Ulterior

उत्तर

16

size_t को आमतौर पर हस्ताक्षरित के रूप में परिभाषित किया जाता है। जब आप किसी हस्ताक्षरित और हस्ताक्षरित संख्या या बराबर रैंक की तुलना करते हैं तो हस्ताक्षरित संख्या को हस्ताक्षरित में परिवर्तित कर दिया जाता है। चूंकि हस्ताक्षरित संख्या शायद आपकी मशीन नकारात्मक संख्या में दो पूरक में दर्शायी जाती है, वास्तव में बड़ी होती है।

तो एक बार i हिट -1, तुलनात्मक रूप से तुलना इसकी तुलना में बड़ी है।

आप देख सकते हैं कि यह आपके कंपाइलर में चेतावनी चालू करके हो रहा है।

बजना -Weverything के साथ अपने कार्यक्रम संकलन इस चेतावनी

unsigned.c:10:30: warning: comparison of integers of different signs: 
        'int' and 'size_t' (aka 'unsigned long') [-Wsign-compare] 
+0

हाँ, मुझे लगता है कि यह सही है। –

+2

विस्तार फिक्स: जब आप एक हस्ताक्षरित और हस्ताक्षरित संख्या की तुलना करते हैं _of बराबर रैंक_ हस्ताक्षरित संख्या _converted_ को हस्ताक्षरित करने के लिए है। – aschepler

+0

आश्चर्यजनक रूप से पर्याप्त, के लिए पुनः लिखना (size_t i = len-1; i <= len; i--) भी ठीक काम करता प्रतीत होता है। संदर्भ के लिए, मैं जीएनयू जीडीबी 6.3.50-20050815 (ऐप्पल संस्करण जीडीबी-1708) x86_64-सेब-डार्विन का उपयोग कर रहा हूं। – sager89

संबंधित मुद्दे