2011-09-18 9 views
8

मैं एक स्ट्रिंग को उलटा करने की कोशिश कर रहा हूं।बस त्रुटि समस्या निवारण

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

int main(){ 
    char *c="I am a good boy"; 
    printf("\n The input string is : %s\n",c); 
    printf("\n The length of the string is : %d\n",strlen(c)); 
    int i,j; 
    char temp; 
    int len=strlen(c); 
    for(i=0,j=len-1;i<=j;i++,j--) 
    { 
      temp=c[i]; 
      c[i]=c[j]; 
      c[j]=temp; 
    //printf("%c\t%c\n",*(c+i),*(c+(len-i-1))); 
    } 
    printf("\n reversed string is : %s\n\n",c); 
} 

कोड आउटपुट एक Bus error : 10:

इस कोड को मैंने कोशिश की है।

लेकिन अगर मैं एक ही कोड को फिर से लिखने के रूप में:

int main(void) 
{ 
    char *str; 
    str="I am a good boy"; 
    int i,j; 
    char temp; 
    int len=strlen(str); 
    char *ptr=NULL; 
    ptr=malloc(sizeof(char)*(len)); 
    ptr=strcpy(ptr,str); 
    for (i=0, j=len-1; i<=j; i++, j--) 
    { 
     temp=ptr[i]; 
     ptr[i]=ptr[j]; 
     ptr[j]=temp; 
    } 
    printf("The reverse of the string is : %s\n",ptr); 
} 

यह बिल्कुल ठीक काम करता है।

बस कोड या विभाजन विभाजन को फेंकने वाला पहला कोड क्यों है?

+1

कृपया अपना कोड दोबारा सुधारें। –

+0

मैंने जितना संभव हो प्रारूपण करने की कोशिश की, लेकिन मैं वास्तव में नहीं जानता कि उन्हें कैसे गठबंधन किया जाए। – sethu

+1

कृपया चार कोडों के साथ इसे इंडेंट करके अपना कोड प्रारूपित करें। – SLaks

उत्तर

16

बस त्रुटि होती है क्योंकि कई (यदि अधिकतर या सभी आधुनिक नहीं हैं) सी कंपाइलर्स में, स्ट्रिंग अक्षर केवल पढ़ने-योग्य स्मृति में आवंटित किए जाते हैं।

आप जगह में स्ट्रिंग को उलट रहे हैं। अपने पहले कोड स्निपेट में आप एक स्ट्रिंग अक्षर में लिखने की कोशिश कर रहे हैं। अच्छा विचार नहीं।

दूसरे मामले में, आपने एक स्ट्रिंग malloc'd जो इसे ढेर पर डाल दिया। उस स्ट्रिंग को जगह में उलटा करना अब सुरक्षित है।

परिशिष्ट

टिप्पणीकार जो बस त्रुटियों बनाम segfaults के बारे में पूछा करने के लिए

, यह एक बड़ा सवाल है। मैंने दोनों को देखा है। यहाँ पर एक मैक एक बस त्रुटि है:

$ cat bus.c 
char* s = "abc"; int main() {s[0]='d'; return 0;} 

$ gcc --version bus.c && ./a.out 
i686-apple-darwin10-gcc-4.2.1 (GCC) 4.2.1 (Apple Inc. build 5659) 
Copyright (C) 2007 Free Software Foundation, Inc. 
This is free software; see the source for copying conditions. There is NO 
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 

Bus error 

अन्य ऑपरेटिंग सिस्टम पर/compilers आप वास्तव में एक segfault मिल सकता है।

+0

मैंने सोचा कि केवल पढ़ने योग्य स्मृति लिखने की कोशिश करने से एक सीगफॉल्ट होगा, बस त्रुटि नहीं? या वह ओएस-विशिष्ट है? – cHao

+0

मैंने दोनों को देखा है! –

+0

आपको वहां कुछ बेकार सामान करना होगा। :) केवल समय मैंने कभी भी एक त्रुटि त्रुटि देखी है, मदरबोर्ड खराब था। – cHao

1

"I am a good boy" के रूप में निर्दिष्ट वर्ण सरणी आमतौर पर स्थिर होती हैं - आप उन्हें संशोधित नहीं कर सकते हैं। यही कारण है कि आपका पहला संस्करण दुर्घटनाग्रस्त हो जाता है। दूसरा नहीं है, क्योंकि आप डेटा की एक प्रति बनाते हैं और फिर इसे संशोधित करते हैं।

6

इसे ढेर में कॉपी करना एक विकल्प है। हालांकि, अगर आप सिर्फ एक स्थानीय (ढेर) सरणी आवंटित करना चाहते हैं, तो आप कर सकते हैं:

char str[] = "I am a good boy"; 

फिर, निरंतर स्ट्रिंग ढेर में कॉपी किया जायेगा।

0

char * str = "मैं एक अच्छा लड़का हूं"; शाब्दिक के रूप में इलाज और इसे संशोधित करने की कोशिश में बस त्रुटि होगी। यह कॉन्स char * str = "मैं एक अच्छा लड़का हूं" के बराबर है, यानी एक स्थिर स्ट्रिंग के लिए सूचक और निरंतर स्ट्रिंग को संशोधित करने की कोशिश की अनुमति नहीं है।

संपादित करें: जिस क्षण आप malloc() और प्रतिलिपि बनाते हैं, मूल स्ट्रिंग की एक प्रति के साथ खेल रहे हैं और पीआरटी 'कॉन्स्ट char *' प्रकार का नहीं है, बल्कि यह 'char * ptr' है और शिकायत नहीं करता है।

0

ग के साथ संकलन ++ (छ ++) एक स्ट्रिंग शाब्दिक बताए एक गैर स्थिरांक चार * जो इस त्रुटि को रोकने के लिए बनाया गया है करने के लिए की निंदा पता चलता है:

[email protected]:~/udlit_debug$ g++ ../buserr.cpp 
../buserr.cpp: In function ‘int main()’: 
../buserr.cpp:5:13: warning: deprecated conversion from string constant to ‘char*’ 
../buserr.cpp:7:61: warning: format ‘%d’ expects type ‘int’, but argument 2 has type ‘size_t’ 

प्रासंगिक चेतावनी लाइन पर है 5.

संकेत के अनुसार कॉन्स्ट char * की घोषणा बदलना शाब्दिक स्ट्रिंग में असाइनमेंट को रोकता है।

यह भी एक सबक है कि आपको चेतावनियों को अनदेखा क्यों नहीं करना चाहिए।