LPCSTR

2009-10-13 4 views
8

की लंबाई को कैसे ढूंढें I amoi() का उपयोग करके एक एलपीसीस्ट्रेट को एक पूर्णांक में बदलने की कोशिश कर रहा हूं, और यह सत्यापित करने के लिए कि रूपांतरण सफलतापूर्वक हुआ है, मैं इसे पूर्णांक में अंकों की संख्या गिनना चाहता हूं और मूल एलपीसीस्ट्र (इसमें पूर्णांक के अलावा कुछ भी नहीं होना चाहिए)LPCSTR

मुझे एलपीसीस्ट्र की लंबाई की गणना करने के लिए एक अच्छा तरीका खोजने में कठिनाई हो रही है। अब तक एकमात्र तरीका सिर्फ तब तक गिन रहा है जब तक कि मैं '/ 0'

बेहतर तरीके के लिए कोई सुझाव देता हूं?

धन्यवाद

उत्तर

11

क्या स्ट्रेलन नहीं करता है?

+0

दोह! क्षमा करें दोस्तों, मस्तिष्क फार्ट। इस बात को याद रखने के लिए किसी प्रकार का मानसिक ब्लॉक होना चाहिए और इसे मेरी किसी भी खोज पर कभी नहीं देख सकता –

+3

lstrlen() यह है ... –

2

नहीं।

इस तरह आप एक सी-स्ट्रिंग की लंबाई पाते हैं। आप strlen का उपयोग कर सकते हैं, लेकिन इसे अभी भी पूरी स्ट्रिंग को नीचे जाना होगा और '\0' से पहले वर्णों की संख्या गिनना होगा।

8

आप strtol का उपयोग कर सकते हैं और endptr का उपयोग यह जांचने के लिए कर सकते हैं कि यह स्ट्रिंग (0 बाइट) का अंत है या नहीं।

गणना करना आवश्यक नहीं होगा। "00" के परिणामस्वरूप 0 होगा, लेकिन 0 में एक अंक होगा और मूल स्ट्रिंग की लंबाई 2.

5

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

नमूना उपयोग:

size_t len = strlen(szNumber); 
2

प्रकाश से अधिक गर्मी के उत्पादन के बारे में बात ... :) 'atoi' का उपयोग बंद करके कि अपनी समस्याओं के सबसे का समाधान होगा। 'atoi' कोई व्यावहारिक मूल्य के साथ एक मृत समारोह है। किसी स्ट्रिंग प्रस्तुति को किसी संख्या में रूपांतरित करने का उचित तरीका 'स्ट्रेटो ...' समूह ('स्ट्रेटोल', 'स्ट्रेटोल' इत्यादि) से कार्य करता है। यह फ़ंक्शंस आपको तुरंत यह निर्धारित करने के लिए पर्याप्त जानकारी वापस कर देगा कि रूपांतरण त्रुटि हुई है या नहीं।

0

मैं चीजों को थोड़ा अलग तरीके से करते हैं - इनपुट के साथ एक stringstream प्रारंभ, एक पूर्णांक पढ़ा तो जाँच करें कि क्या धारा खाली है:

#include <sstream> 
#include <iostream> 

typedef char const *LPCSTR; 

template <class T> 
bool check_read(LPCSTR input, T &val) { 
    std::istringstream reader(input); 

    reader >> val; 
    char ch; 
    if (reader >> ch) { 
     std::cerr << "\nUnconverted character: " << ch << std::endl; 
     return false; 
    } 
    return true; 
} 

int main() { 
    LPCSTR inputs[] = {"12345", "54321a"}; 
    int a; 

    for (int i=0; i<2; i++) { 
     check_read(inputs[i], a); 
     std::cout << "Converted: " << a << std::endl; 
    } 
    return 0; 
} 

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

अभी तक एक और संभावना के रूप में, आप Boost lexical_cast पर विचार कर सकते हैं (जिसे थोड़ा अलग पैक किया गया है, लेकिन ऊपर दिए गए कोड के समान ही है)।

1
LPCSTR lpText = "test"; 
long lTextLen = CString(lpText).GetLength(); 
14

एक LPCTSTR की लंबाई (इस मामले में, अंकों की संख्या) को खोजने के लिए, आपको lstrlen() और नहीं strlen() का उपयोग करना चाहिए। स्रोत: MSDN

0

LPCSTR के बाद से const char* (डी-मैक्रोइंग के बाद), strlen ठीक होगा।

हालांकि यदि आप विंडोज़ फ़ंक्शन के बाद LPCSTR इनपुट के अनुरूप स्पष्ट रूप से परिभाषित किए गए हैं, तो आप lstrlenA का उपयोग कर सकते हैं। मुझे गंभीरता से संदेह है कि इसमें कोई व्यावहारिक अंतर है और इसे strlen पर कॉल करना है।

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