2010-01-07 12 views
11

सबसे आसान तरीके से, मैं कैसे जांच सकता हूं कि फ़ंक्शन scanf से प्रारंभ एक पूर्णांक एक संख्या है?जांचें कि क्या स्कैनफ़ का मान एक नंबर है?

+1

मैं इस सवाल का जवाब देता हूं। http://stackoverflow.com/questions/456303/how-to-validate-input-using-scanf – hometoast

+0

यदि कोई पूर्णांक संख्या है? –

+2

मैंने सवाल को "अगर स्ट्रिंग पढ़ा है तो एक वैध पूर्णांक है।" – hometoast

उत्तर

8

http://www.cplusplus.com/reference/clibrary/cstdio/scanf/

सफलता पर, [scanf] रिटर्न मदों की संख्या सफलतापूर्वक पढ़ें। यह गणना रीडिंग या उससे कम, यहां तक ​​कि शून्य की अपेक्षित संख्या से मेल खा सकती है, यदि मिलान विफलता होती है। किसी भी डेटा से पहले इनपुट विफलता के मामले में सफलतापूर्वक पढ़ा जा सकता है, ईओएफ लौटा दिया गया है।

तो तुम कुछ इस तरह कर सकता है:

#include <stdio.h> 

int main() 
{ 
    int v; 
    if (scanf("%d", &v) == 1) { 
     printf("OK\n"); 
    } else { 
     printf("Not an integer.\n"); 
    } 
    return 0; 
} 

लेकिन यह सुझाव है कि जाती है कि आप fgets और strtol बजाय का उपयोग करें।

+0

धन्यवाद आदमी, यह काम करता है लेकिन अगर मैं इसे लूप में डालता हूं, तो ठीक से काम नहीं करता है, अगर इनपुट शुरुआत में एक स्ट्रिंग है, तो लूप अनंत है, मैं हल कर सकता हूं? – genesisxyz

+0

मैंने एक getchar() रखा है; अंदर ... अब काम करता है – genesisxyz

+1

'sscanf' और 'scanf' एक बुरा विचार है। दोनों ओवरफ्लो पर अपरिभाषित व्यवहार उत्पन्न करते हैं। – AnT

6

आपका प्रश्न अजीब बात है। एक प्रारंभिक पूर्णांक हमेशा एक संख्या है (जाल प्रस्तुतियों के विदेशी मामलों से अलग), जिसका अर्थ है कि कुछ भी जांचने की आवश्यकता नहीं है।

मुझे लगता है कि आपको यह जांचने की आवश्यकता है कि दिए गए स्ट्रिंग किसी संख्या का एक वैध प्रतिनिधित्व है। इसके लिए, आपको सबसे पहले परिभाषित करने की आवश्यकता है कि वैध प्रतिनिधित्व कैसा दिखना चाहिए। क्या आप साइन इजाजत देते हैं? क्या एक अनावश्यक + अनुमत है (एक संकेत के रूप में)? हेक्साडेसिमल के लिए 0x उपसर्ग के बारे में क्या? और इसी तरह।

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

उन उत्तरों से सावधान रहें जो आपके स्वयं के फ़ंक्शन को लिखने का सुझाव देते हैं जो इन नियमों को सत्यापित करेगा। यह सिर्फ कोई समझ नहीं आता है, क्योंकि मानक फ़ंक्शन पहले से मौजूद है। साथ ही, सख्ती से बोलते हुए, वास्तविक जीवन प्रोग्रामिंग में वास्तविक रूपांतरण के बिना सत्यापन करने की शायद ही कभी आवश्यकता होती है। strto... दोनों करेंगे।

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

संबंधित मुद्दे