IDE क्यों सोचता है कि कोई त्रुटि है?

"केस लेबल मान इस स्विच में लाइन 9 C/C++(1578) पर पहले ही दिखाई दे चुका है"

int main(int argc, char const *argv[])
{
    for (int i = 0; i < argc; i++)
    {
        switch (*argv[i])
        {
            case 'drow': printf("drow detected");
            break;
            case 'drows': printf("drows detected"); //line 9
            break;
            case 'rows': printf("rows detected"); //error at the first apostrophe '
            break;
            default: printf("Unknown arg, skipping.");
            break;
        }  
    }
    return 0;
}
1
Momoos 1 नवम्बर 2020, 13:45

1 उत्तर

सबसे बढ़िया उत्तर

आप एक लेबल के रूप में एक मल्टीबाइट वर्ण स्थिरांक का उपयोग कर रहे हैं

case 'drow':

इसका मूल्य int प्रकार से परिभाषित कार्यान्वयन है।

सी मानक, 6.4.4.4 वर्ण स्थिरांक।

एक पूर्णांक वर्ण स्थिरांक का मान जिसमें एक से अधिक वर्ण (उदा., 'ab'), या एक वर्ण या एस्केप अनुक्रम होता है जो एकल-बाइट निष्पादन वर्ण के लिए मैप नहीं करता है, कार्यान्वयन-परिभाषित है।

तो ऐसा लगता है कि स्थिरांक 'drow' और 'drows' का पूर्णांक मान समान है।

संकलक एक संदेश जारी कर सकता है कि निरंतर 'drows' अपने प्रकार के लिए बहुत लंबा है।

दूसरी ओर, स्विच स्टेटमेंट में प्रयुक्त अभिव्यक्ति

switch (*argv[i])

एक मल्टीबाइट चरित्र नहीं है। तो किसी भी मामले में स्विच स्टेटमेंट का कोई मतलब नहीं है।

स्विच स्टेटमेंट के बजाय आप if-else स्टेटमेंट का उपयोग कर सकते हैं। उदाहरण के लिए

if ( strcmp( argv[i], "drow" ) == 0 )
{
    //...
}
else if ( strcmp( argv[i], "drows" ) == 0 )
{
    //...
}
else if ( strcmp( argv[i], "rows" ) == 0 )
{
    //...
}
else
{
    //...
}
1
Vlad from Moscow 1 नवम्बर 2020, 11:02