मेरे पास एक फ़ाइल में संग्रहीत डेटा के साथ एक प्रोग्राम है और structs में लोड हो जाता है।

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

यह कार्यक्रम का एक हिस्सा है:

char check;
    
if(p->vetor.id == jogo){
            
    printf("Reference: %d\n", jogo);
        fflush(stdin);
    printf("\nTeam 1: ");
        if(getchar() != '\n'){ // METHOD 1
            gets(p->vetor.eqTeam1); 
        }
        fflush(stdin);
        
    printf("\nTeam 2: ");
        if(scanf("%c", &check) && check != '\n'){ //METHOD 2
            gets(p->vetor.eqTeam2);
        }
        fflush(stdin);
}

यह जांचता है कि इनपुट एक ENTER है (और यह काम करता है) लेकिन जब मैं वहां कुछ लिखता हूं तो यह पहला अक्षर "खाता है" क्योंकि इसे ENTER है या नहीं, इससे पहले जांचना आवश्यक है, क्या खोए हुए पत्र को वापस देने का कोई तरीका है हो जाता है () ?

आपकी सहायता के लिए धन्यवाद।

0
Arty 9 जिंदा 2021, 20:13

2 जवाब

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

scanf का उपयोग न करें और फिर कभी नहीं gets का उपयोग करें।

केवल fgets का उपयोग करके आपकी समस्या का समाधान किया जा सकता है

printf("\nTeam 2: ");
fflush(stdout);
char input[256];  // same size of eqTeam
fgets(input, sizeof(input), stdin);
if (input[0] != '\n') {
    strcpy(p->vetor.eqTeam2);
}

यह हमेशा एक पूर्ण पंक्ति में पढ़ा जाएगा, लेकिन यदि पंक्ति का पहला वर्ण एक नई पंक्ति है, तो उपयोगकर्ता ने केवल एंटर दबाया है। यदि पहला चार कुछ और है, तो इनपुट को सही स्थान पर कॉपी किया जाता है। ध्यान दें कि इनपुट बफर एक उपयुक्त आकार का होना चाहिए, यहां मैंने सिर्फ एक अनुमान लगाया है जो निश्चित रूप से सही नहीं है (लेकिन मुझे आवश्यक जानकारी की कमी है)

और एक और बात, कभी भी फ्लश न करें stdin, आपको fflush(stdout) करना होगा क्योंकि fflush एक आउटपुट ऑपरेशन है।

0
koder 9 जिंदा 2021, 21:40

यह जांचता है कि इनपुट एक ENTER है (और यह काम करता है) लेकिन जब मैं वहां कुछ लिखता हूं तो यह पहला अक्षर "खाता है" क्योंकि इसे ENTER है या नहीं, इससे पहले जांचना आवश्यक है, क्या खोए हुए पत्र को वापस देने का कोई तरीका है हो जाता है () ?

फ़ंक्शन ungetc() शायद वह है जिसे आप ढूंढ रहे हैं।

हालांकि, इनपुट बफ़र्स की सफाई सी में एक आवर्तक विषय है। ध्यान रखें कि fflush(stdin) एक अपरिभाषित व्यवहार है, क्योंकि इसका वास्तव में कोई मतलब नहीं है: बफर को फ्लश करने से इसकी सामग्री नहीं गिरती है, यह वास्तव में इसके तत्काल शिपिंग को अपने अंतिम गंतव्य की ओर ट्रिगर करता है, जो कि इनपुट बफर के मामले में है ... स्वयं!

कुछ सिस्टम इस गैर-परिभाषित व्यवहार स्थिति का लाभ उठाते हैं ताकि वास्तव में इसे अपेक्षित रूप से छोड़ दिया जा सके (जो कि किसी अन्य चीज़ की तरह एक अपरिभाषित व्यवहार है), लेकिन यह एक जाल है क्योंकि प्रोग्रामर को कुछ ऐसा करने की आदत हो जाती है जो काम करने वाला नहीं है। मेरी नजर में, यहां सबसे सुसंगत व्यवहार कुछ भी नहीं करना है, क्योंकि बफर की सामग्री पाठक के लिए पहले से उपलब्ध है।

1
Obsidian 9 जिंदा 2021, 21:53