किसी दिए गए string str
के लिए प्रत्येक को फायदे और नुकसान के साथ पूरा करने के कई तरीके हैं।
के रूप में सुझाव दिया herestrtol
के बाहर पैरामीटर के पात्रों को पढ़ने के नंबर पाने के लिए इस्तेमाल किया जा सकता। strtol
वास्तव में long
पर int
नहीं देता है, इसलिए वापसी पर एक कास्ट हो रहा है।
char* size;
const int num = strtol(i.c_str(), &size, 10);
if(distance(i.c_str(), const_cast<const char*>(size)) == i.size()) {
cout << "strtol: " << num << endl;
} else {
cout << "strtol: error\n";
}
ध्यान दें कि यह i.c_str()
का उपयोग करता है एक ही स्ट्रिंग का उल्लेख करने के।c_str
रिटर्न नहीं एक अस्थायी चरित्र भंडारण के रूप में सेवारत अंतर्निहित सरणी सूचक अगर आप सी ++ 11 है:
c_str()
और data()
एक ही समारोह में प्रदर्शन
भी ध्यान रखें कि सूचक c_str
द्वारा दिया जाएगा strtol
और distance
कॉल के बीच मान्य हो, जब तक:
- किसी भी मानक पुस्तकालय समारोह
string
पर गैर const
सदस्य कार्यों कॉलिंग, operator[]
, rbegin()
, end()
और rend()
छोड़कर
at()
,
front()
,
back()
,
begin()
, को
string
करने के लिए एक गैर
const
संदर्भ पासिंग
यदि आप इन मामलों में से किसी एक का उल्लंघन करते हैं तो आपको i
के अंतर्निहित const char*
की अस्थायी प्रतिलिपि बनाने की आवश्यकता होगी और उस पर परीक्षण करें।
sscanf
%n
का उपयोग वर्णों की संख्या को पढ़ने के एक सूचक तुलना कर की तुलना में अधिक सहज ज्ञान युक्त हो सकता है वापस जाने के लिए कर सकते हैं। यदि आधार महत्वपूर्ण है, sscanf
एक अच्छा विकल्प नहीं हो सकता है। strtol
और stoi
के विपरीत जो समर्थन 2 - 36, sscanf
केवल ऑक्टल (%o
), दशमलव (%d
), और हेक्साडेसिमल (%x
) के लिए विनिर्देशक प्रदान करता है।
size_t size;
int num;
if(sscanf(i.c_str(), "%d%n", &num, &size) == 1 && size == i.size()) {
cout << "sscanf: " << num << endl;
} else {
cout << "sscanf: error\n";
}
के रूप में सुझाव दिया herestoi
रों %n
के उत्पादन पैरामीटर sscanf
तरह काम करता है 'नंबर लौटने के पात्रों पढ़ें। सी ++ को ध्यान में रखते हुए यह string
लेता है और stoi
से ऊपर सी कार्यान्वयन के विपरीत invalid_argument
फेंकता है यदि पहले गैर-व्हाइटस्पेस वर्ण को वर्तमान आधार के लिए अंक नहीं माना जाता है, और दुर्भाग्य से इसका मतलब है कि सी कार्यान्वयन के विपरीत इसे एक त्रुटि की जांच करनी चाहिए try
और catch
दोनों ब्लॉक में।
try {
size_t size;
const auto num = stoi(i, &size);
if(size == i.size()) {
cout << "stoi: " << num << endl;
} else {
throw invalid_argument("invalid stoi argument");
}
} catch(const invalid_argument& /*e*/) {
cout << "stoi: error\n";
}
[Live Example]
मुझे लगता है कि आपके पास SO में जवाब हैं: http://stackoverflow.com/questions/2844817/how-do-i-check-if-ac-string-is-an-int और http://stackoverflow.com/प्रश्न/1243428/कन्वर्ट-स्ट्रिंग-टू-इंट-बाय-बूल-असफल-इन-सी/1243435 # 1243435 – deepmax
@ डिप्मैक्स यूप, कम से कम उदाहरण के प्रयोजनों के लिए मैंने इसे शामिल नहीं किया, लेकिन मेरे स्थानीय परीक्षण में कोड मैं इसे लूप के शीर्ष पर कर रहा हूं: 'cout <<" \ tinput स्ट्रिंग: "<< i << (all_of (i, i + strlen (i), बाइंड (isdigit, प्लेसहोल्डर :: _ 1)) ? "अच्छा है \ n": "खराब है \ n"); हालांकि, हालांकि, मैं इस तरह से जांच सकता हूं * मैं नहीं चाहता हूं। अन्य सभी कार्यों को प्रत्येक चरित्र के माध्यम से भी कदम उठाना चाहिए और मैं जो कुछ भी पहले से जानता हूं उसका उपयोग करने का एक तरीका बनाना चाहता हूं। –
@ डिप्मैक्स आप गलत हैं यह डुप्लिकेट नहीं है, वे उत्तर ** ** ** यह सत्यापित नहीं करते हैं कि संपूर्ण स्ट्रिंग पढ़ी गई है। –