सी

2013-04-20 5 views
5

में लूप के दौरान स्विच स्टेटमेंट लूप के दौरान स्विच स्टेटमेंट से संबंधित कई पोस्टिंग हैं, इस तथ्य को छोड़कर कि उनमें से कोई भी सी में नहीं किया गया है, कम से कम मैंने जो देखा है उससे कम है। सी ++ बूलियन एक्सप्रेशन बना सकता है, जिसे मैं जानता हूं, लेकिन सी में नहीं। मेरे पास थोड़ी देर लूप है जिसमें स्विच कंट्रोल होता है। हालांकि, जब मैं अपने स्विच के भीतर ब्रेक स्टेटमेंट लिखता हूं, तो यह लूप की शुरुआत में वापस जाता है और मेरा प्रोग्राम हमेशा के लिए चलता है। मेरे द्वारा उपयोग किए जाने वाले कार्यों को अनदेखा करें, क्योंकि वे निश्चित रूप से काम करते हैं। मुझे सिर्फ घोंसले के संचालन पर कुछ स्पष्टीकरण की आवश्यकता है। धन्यवाद!सी

Here is my main.c: 

while(1) 
{ 
    printf("0) Exit\n1) List Tasks\n2) Add Task\n");            
    printf("3)Delete Task\n4) Add Task From File\n");           
    printf("What would you like to do?\n"); 
    fgets(buf1, 50, stdin);                  
    p = atoi(buf1); 
    switch(p) 
    { 
      case 0: 
      break; 
      case 1: 
      printTaskList(pTaskList); 
      break; 
      case 2: 
      printf("Enter task name: "); 
      fgets(buf2,100,stdin); 
      printf("Enter task priority: "); 
      fgets(buf3,100,stdin); 
      printf("Enter task start date: "); 
      fgets(buf4,50,stdin); 
      pTask = makeTask(buf2,buf4,buf3); 
      addTaskToEnd(pTaskList,pTask); 
      break; 
      case 3: 
      printTaskList(pTaskList); 
      printf("What task would you like to delete? "); 
      fgets(buf6,50,stdin); 
      taskNum = atoi(buf6); 
      removeTask(pTaskList,taskNum); 
      break; 
      case 4: 
      printf("Enter the filename "); 
      fgets(buf7,50,stdin); 
      break; 
      default: 
      printf("ERROR: %d: Incorrect menu option\n", p); 
    } 
} 
+0

आपका तोड़ बयान स्विच खंड के बाकी, आप स्विच करने के बाद लाइन पर बाहर डंप जिसका अर्थ है छोड़ने के लिए कार्य करता है। नेस्टेड स्कोप से बाहर निकलने का एक सामान्य समाधान कोड को फ़ंक्शन में ले जाना और ब्रेक के बदले वापसी का उपयोग करना है। – 7stud

+0

उन बिंदुओं की पहचान करें जिन्हें आप अपने स्विच बॉडी के अंदर लूप के बाहर तोड़ना चाहते हैं, इसे इंगित करने वाला ध्वज सेट करें, और 'जबकि (अभिव्यक्ति)' को ब्रेक-स्टेट (यानी 'जबकि (सत्य)' के लिए ध्वज का मूल्यांकन करें 'जबकि (stay_in_while)', और है 'स्विच कोड द्वारा मंजूरी दे दी stay_in_while' आप को तोड़ने के लिए चाहते हैं। – WhozCraig

+1

आप गलत कर रहे हैं, सी बूलियन अभिव्यक्ति और डेटा प्रकार है। यह एक builtin प्रकार' _Bool' है और आप 'शामिल करता है, तो ' वहाँ भी कर रहे हैं 'bool',' FALSE', और 'TRUE'। –

उत्तर

13

break; से बाहर निकल गया जाना चाहिए निकटतम switch या पाश enclosing से बाहर बाहर निकल जाएगा साथ

while(1) 

प्रतिस्थापित करना चाहिए। दो स्तरों को कूदने के लिए, आपको ड्रेडेड goto का उपयोग करना होगा, या return पुनर्गठन करना होगा वांछित अर्थशास्त्र पूरा करेगा।

while(1) { 
    switch(x) { 
    case 0: goto EndWhile; 
    } 
} 
EndWhile: ; 

या

void loop() { 
    while(1) { 
     switch(x) { 
     case 0: return; 
     } 
    } 
} 
//... 
loop(); 
//... 

आप पूरी तरह से सी में एक बूलियन अभिव्यक्ति का उपयोग बस एक int उपयोग कर सकते हैं।

int quit = 0; 
while(!quit) { 
    switch(x) { 
    case 0: quit = 1; break; 
    } 
} 

सी में भी एक बुलियन डेटा प्रकार है, यदि आप वास्तव में इसे चाहते हैं।

#include <stdbool.h> 

bool quit = false; 
while(!quit) { 
    switch(x) { 
    case 0: quit = true; break; 
    } 
} 

और पूरी तरह से पागल के लिए एक और विकल्प।

#include <setjmp.h> 

jmp_buf jbuf; 
if (!setjmp(jbuf)) 
    while(1) { 
     switch(x) { 
     case 0: longjmp(jbuf, 1); 
     } 
    } 
+0

आपने इसे वाकई स्पष्ट कर दिया! आपको बहुत - बहुत धन्यवाद! आपके कोड ने मेरी अनंत लूप त्रुटि, साथ ही आप सभी लोगों को ठीक किया है। मुझे एहसास हुआ कि मुझे फ्लैग करना था जहां मैं लूप से बाहर निकलना चाहता था, इसलिए मैंने "छोड़ने" की अस्वीकृति बनने के लिए "छोड़ दिया" बदल दिया। – umarqattan

+0

'int' को बूलियन कार्यों के रूप में उपयोग करना, और यह बहुत आम है, लेकिन मैं निश्चित रूप से stdbool शैली को प्राथमिकता देता हूं। 'जबकि', 'if', और इसी तरह सभी एक बूलियन अभिव्यक्ति लेते हैं, और इसके बजाय उन्हें संख्या देने के लिए तर्कसंगत रूप से सही नहीं लगता है। 'छोड़ें' एक संख्या नहीं है, यह एक शर्त है। – Gauthier

0

आप कभी भी लूप से बाहर नहीं निकलें। ब्रेक सिर्फ आपके स्विच को तोड़ देगा। आप कुछ और ही मतलब है कि यह है कि जब लूप

0

आपका ब्रेक केवल, स्विच बयान छोड़ देता है तो हमेशा के लिए

while(1) 

पाश में पर जारी है।

1

आप सी में भी बूलियन एक्सप्रेशन कर सकते हैं। 1 999 से सी मानक में stdbool.h शीर्षलेख और डेटा प्रकार बूल है। (!) इस तरह के दृश्य स्टूडियो 2012 में एक के रूप में पुराने सी बोलियों में, वहाँ कोई बूलियन डेटा प्रकार है, तो आप के बजाय सादे ints उपयोग करने की आवश्यकता है:

int keep_looping = 1; 
while (keep_looping) { 
    .... 
    if (....) 
     keep_looping = 0; 
} 
+0

सी 99 में कोई 'stdbool.h' नहीं है? मुझे विश्वास करना मुश्किल लगता है ... – Sebivor

+0

@modifiable lvalue: मानक में निश्चित रूप से है। और विजुअल स्टूडियो 2012 _still_ में यह नहीं है। लेकिन आप सही हैं, मुझे यह नहीं कहना चाहिए था कि कोई बुलियन प्रकार नहीं है। आइए आशा करते हैं कि वह माइक्रोसॉफ्ट के साथ फंस नहीं गया है। –

+0

विजुअल स्टूडियो 2012 में सी कंपाइलर नहीं है। किसी भी काउंटर 'विकल्प के रूप में संकलित' के मुकाबले किसी भी "लेकिन वहां एक 'संकलन करने के हित में, तर्कसंगत है: पिछले दशक में वीएस का उपयोग करके संकलित करने में विफल होने के लिए यह पूरी तरह से वैध सी कोड के लिए असामान्य नहीं है। यदि यह सी कोड संकलित नहीं कर सकता है, तो यह एक सी संकलक नहीं है। – Sebivor

1

सी ++, बूलियन भाव बना सकते हैं जो मैं मुझे पता है, लेकिन सी

ओह? तो 0 == 0 क्या है, यदि बुलियन अभिव्यक्ति नहीं है? यदि आप bool प्रकार के चर के संदर्भ में हैं, तो सुनिश्चित करें कि आप #include <stdbool.h> हैं।

हालांकि, जब मैं लिखने मेरी स्विच के भीतर बयान को तोड़, इसे वापस पाश की शुरुआत करने के लिए चला जाता है और मेरा कार्यक्रम हमेशा के लिए चलाया बनाता है। मेरे द्वारा उपयोग किए जाने वाले कार्यों को अनदेखा करें, क्योंकि वे निश्चित रूप से काम करते हैं।मुझे घोंसले के अपने हैंडलिंग पर कुछ स्पष्टीकरण की आवश्यकता है। धन्यवाद!

नहीं। यह लूप की शुरुआत में वापस नहीं जाता है। स्विच स्टेटमेंट के अंत से निष्पादन जारी है (switch ई बंद होने के तुरंत बाद, })। आपके परिस्थिति में, यह लूप की शुरुआत में वापस जा रहा है।

आप के लिए उपलब्ध विकल्पों में से कुछ कर रहे हैं। अन्य आपके लूप को नियंत्रित करने के लिए एकमात्र चर का उपयोग करने का सुझाव दे रहे हैं। यह एक अच्छा विचार होगा, लेकिन वे नए चर का उपयोग करने का सुझाव दे रहे हैं, इस तथ्य के बावजूद कि आपके तर्क में चर पहले से मौजूद है। आप अपनी समस्या इस तरह से हल करने के लिए चाहते हैं, पर विचार करें:

do { 
    /* ... */ 
} while (p != 0); 
मुख्य से

वैकल्पिक रूप से, return जब आप बाहर निकलना चाहते हैं, या अन्य कार्यों से exit(0); कहते हैं। यदि आप अतिरिक्त सफाई/आउटपुट कोड चलाने के लिए चाहते हैं तो यह सब उपयोगी नहीं है।

इस परिदृश्य में, switch नियंत्रण संरचना वास्तव में किसी भी if/else if/else शाखाओं की एक श्रृंखला की तुलना में बेहतर नहीं है। आप if/else if/else शाखाओं उपयोग करने के लिए थे, तो आप में सक्षम break; को लूप से बाहर और अधिक आसानी से होगा। मैं switch नियंत्रण संरचना का उपयोग करता हूं जब मैं अन्य मामलों में निष्पादन को निष्पादित करना चाहता हूं।

एक और विकल्प के रूप में, आप एक goto अभिव्यक्ति का उपयोग मुख्य के बाहर एक लेबल के लिए लूप से बाहर तोड़ने के लिए कर सकता है। यह सबसे अच्छा होगा जब लूप से कई संभावित निकास बिंदु हैं, जैसे आवंटन त्रुटियों के बाद हैंडलिंग और क्लीनअप।

0

उपयोग बाहर निकलें (0);
जहां भी आप बाहर निकलना चाहते हैं। return बयान:

In this partcular case you have to put the condition in the while loop parameter

अन्य तरीकों जबकि पाश से बाहर आने के लिए उपयोग करने के लिए हो सकता है। लेकिन यह वर्तमान समारोह से बाहर निकल जाएगा।

स्विच के अंदर goto label; का उपयोग करने के लिए उपयुक्त समाधान हो सकता है और फिर लूप के बाहर label: statement; का उपयोग करें।

उदाहरण के लिए:

while(1){ 
    switch(x){ 

    case 0:goto label; 

    default:break; 
    } 
} 
label: 
printf("out of while loop"); 
+1

टिप्पणियों में होना चाहिए। यह आईएमओ का बहुत छोटा जवाब है। –

+0

क्या यह केवल तभी काम नहीं करता जब वह पूरे कार्यक्रम से पूरी तरह से बाहर निकलना चाहता है? '0 वापस' वापस नहीं आएगा, हालांकि सबसे अधिक संभावना अभी भी गलत है? –

+0

'रिटर्न' पूरे कार्यक्रम से बाहर निकलने के दौरान फ़ंक्शन से निकलता है। – abe312