हम दूसरों के साथ एक स्ट्रिंग की तुलना करने के लिए अगर-और सीढ़ी से बच नहीं सकते। यहां तक कि नियमित स्विच-केस भी आंतरिक रूप से (यदि पूर्णांकों के लिए) सीढ़ी है। हम केवल स्ट्रिंग के लिए स्विच-केस का अनुकरण करना चाहते हैं, लेकिन कभी-भी सीढ़ी की जगह नहीं ले सकते। स्ट्रिंग तुलना के लिए एल्गोरिदम का सबसे अच्छा strcmp फ़ंक्शन का उपयोग करने से बच नहीं सकता है। चरित्र की तुलना चरित्र द्वारा किया जाता है जब तक कि एक बेजोड़ नहीं पाया जाता है। तो अगर-और सीढ़ी और स्ट्रैम्प का उपयोग करना अपरिहार्य है।
डेमो
और यहां स्ट्रिंग्स के लिए स्विच-केस का अनुकरण करने के लिए सबसे सरल मैक्रो हैं।
#ifndef SWITCH_CASE_INIT
#define SWITCH_CASE_INIT
#define SWITCH(X) for (char* __switch_p__ = X, int __switch_next__=1 ; __switch_p__ ; __switch_p__=0, __switch_next__=1) { {
#define CASE(X) } if (!__switch_next__ || !(__switch_next__ = strcmp(__switch_p__, X))) {
#define DEFAULT } {
#define END }}
#endif
और आप उनका उपयोग कर सकते हैं
char* str = "def";
SWITCH (str)
CASE ("abc")
printf ("in abc\n");
break;
CASE ("def")
printf("in def\n");
CASE ("ghi")
printf ("in ghi\n");
DEFAULT
printf("in DEFAULT\n");
END
आउटपुट:
in def
in ghi
in DEFAULT
नीचे घोंसले के शिकार का उपयोग किया जाता है:
char* str = "def";
char* str1 = "xyz";
SWITCH (str)
CASE ("abc")
printf ("in abc\n");
break;
CASE ("def")
printf("in def\n");
SWITCH (str1)
CASE ("uvw")
printf("in def => uvw\n");
break;
CASE ("xyz")
printf("in def => xyz\n");
break;
DEFAULT
printf("in def => DEFAULT\n");
END
CASE ("ghi")
printf ("in ghi\n");
DEFAULT
printf("in DEFAULT\n");
END
आउटपुट:
in def
in def => xyz
in ghi
in DEFAULT
यहाँ रिवर्स स्ट्रिंग SWITCH है, जहाँ आप CAS (खंड) में एक चर (स्थिर के बजाय) का उपयोग कर सकते हैं:
char* str2 = "def";
char* str3 = "ghi";
SWITCH ("ghi")
CASE (str1)
printf ("in str1\n");
break;
CASE (str2)
printf ("in str2\n");
break;
CASE (str3)
printf ("in str3\n");
break;
DEFAULT
printf("in DEFAULT\n");
END
आउटपुट:
in str3