मैं एक प्रोग्राम बनाने की कोशिश कर रहा हूं ताकि उपयोगकर्ता को एक ऑपरेशन का इस्तेमाल करने के लिए कहा जा सके और यह दो नंबरों के साथ काम करने के लिए कहेगा। लेकिन अगर उपयोगकर्ता एक नंबर दर्ज करता है और उस पर एक अक्षर है, तो प्रोग्राम को उपयोगकर्ता को एक और इनपुट मांगने के लिए फिर से संकेत देना चाहिए।

 #include<iostream>
    using namespace std;
    void operation(int a);
    class Numbers{
        public:
            int num1, num2;
            float result;
    };
    int main(){
        Numbers input;
        int *ptr1 = &input.num1;
        int *ptr2 = &input.num2;
        float *ptr3 = &input.result;
        int range = 0;


        cout<<"Enter First Number: ";
        while(!(cin>>*(ptr1+range))){   
            cout<<"That's not a number!\n";
            cout<<"\nEnter First Number: ";
            cin.clear();
            cin.ignore(32767, '\n');
        }
        cout<<"Enter Second Number: ";
        while(!(cin>>*(ptr1+range))){   
            cout<<"That's not a number!\n";
            cout<<"\nEnter Second Number: ";
            cin.clear();
            cin.ignore(32767, '\n');
        }   
    }

तो इस कार्यक्रम में जब कोई उपयोगकर्ता एक चरित्र में प्रवेश करता है, तो यह उपयोगकर्ता को दूसरे में प्रवेश करने के लिए प्रेरित करता है। लेकिन समस्या यह है कि जब मैं एक संख्या के भीतर एक पत्र दर्ज करता हूं, तो प्रोग्राम फिर से संकेत नहीं देता है लेकिन यह अगली पंक्ति में कूद जाता है।

पहला नंबर दर्ज करें: t यह कोई संख्या नहीं है!

Enter First Number: 4e      // as you can see, this is what happens, it did not reprompt but it jumped to the next line of code             
Enter Second Number: That's not a number!

Enter Second Number:
c++
1
dej 10 मार्च 2020, 10:28
क्या आपने e4 e और 44 34 को आजमाया है?
 – 
Melon
10 मार्च 2020, 10:33
हाँ यह ठीक काम करता है लेकिन जब नंबर पहले आता है तो ऐसा नहीं होता है।
 – 
dej
10 मार्च 2020, 10:43
महान। अब जैसा कि किसी और ने बताया, कृपया std::stoi का उपयोग करें, कृपया यहां देखें कि यह उदाहरणों के साथ कैसे काम करता है, ताकि आपको इस बात की गहरी समझ हो कि क्या हो रहा है: en.cppreference.com/w/cpp/string/basic_string/stol
 – 
Melon
10 मार्च 2020, 12:31

2 जवाब

आप रूपांतरण जांच को पूरा करने के लिए std::stoi का उपयोग कर सकते हैं।

string number_string
cin >> number_string;
size_t number_end;
int number;
try {
    num = stoi(line, &number_end);
} catch (...) {
    // invalid number
}
if (number_end < line.size() && !isspace(line[number_end])) {
    // invalid number
}
1
miszcz2137 10 मार्च 2020, 11:10

शायद आप isdigit का उपयोग कर सकते हैं। मूल रूप से यह जांचता है कि स्ट्रिंग एक अंक है या नहीं, तो आप इसे जबकि कथन में उपयोग कर सकते हैं। ध्यान दें कि इसे एक चरित्र पर चेक किया जाना चाहिए।

while (!isdigit(some_variable_that_gets_cin)) {
    ....
}

नमूना कैसे प्राप्त करें cin

char[10] number;
cin >> number;
isdigit(number);
ptr = <int> number;
1
catzilla 10 मार्च 2020, 10:53
तो मैं उस समय (!(cin>>*(ptr1+range))) को कैसे बदल सकता हूं?
 – 
dej
10 मार्च 2020, 10:44
^ अपडेट किया गया, आप अपने कार्यान्वयन पर उन कोड स्निपेट्स को सिलाई कर सकते हैं।
 – 
catzilla
10 मार्च 2020, 10:53
क्या यह इस तरह होना चाहिए? जबकि (!isdigit(*(ptr1+range)))। इसे पहले इनपुट पर समस्या है। यह पूरी चीज को दो बार चलाता है लेकिन तीसरी बार इसने ठीक काम किया
 – 
dej
10 मार्च 2020, 10:54
अच्छा, अच्छा हुआ कि इसने तीसरी बार ठीक काम किया। तो मुझे लगता है कि एक बार जब आपके बयानों की तार्किक स्थिति सही हो जाती है, तो आपका कोड पूरी तरह से काम करना चाहिए।
 – 
catzilla
10 मार्च 2020, 10:57
जब मैंने "4e" में प्रवेश किया। कार्यक्रम ने यह किया: "पहला नंबर दर्ज करें: यह कोई संख्या नहीं है!" और अगली पंक्ति एक नंबर मांगती है। जब मैंने फिर से 4e में प्रवेश किया तो इसने ठीक काम किया। तो मैं इसे कैसे ठीक कर सकता हूं ताकि यह पहली कोशिश में ठीक काम करे।
 – 
dej
10 मार्च 2020, 10:59