2010-07-01 7 views
5

संभव डुप्लिकेट:
Char to int conversion in C.ASCII चार सी में रूपांतरण के लिए int

मैं घटा कर किसी पूर्णांक पर एक ASCII वर्ण से परिवर्तित कि एक लंबे समय पहले एक कोर्स में सीखने याद 0 'बुरा है।

उदाहरण के लिए:

int converted; 
char ascii = '8'; 

converted = ascii - '0'; 

क्यों यह एक बुरा व्यवहार माना जाता है? क्या ऐसा इसलिए है क्योंकि कुछ सिस्टम ASCII का उपयोग नहीं करते हैं? सवाल मुझे लंबे समय से परेशान कर रहा है।

+3

यह कोई डुप्लिकेट क्योंकि संदर्भित प्रश्न सभी एन्कोडिंग के बारे में भाषा नास्तिक सवाल यह है कि नहीं है। यह सी के लिए विशिष्ट है जो अतिरिक्त गारंटी प्रदान करता है। –

+0

मुझे इसका जवाब देने में परेशानी होगी, क्योंकि यह एक बुरा अभ्यास नहीं है, जो भी चरित्र सेट का उपयोग किया जाता है, उसे '0' .. '9' संगत होना आवश्यक है, और मुझे आपके पाठ्यक्रम के बारे में पर्याप्त रूप से इसकी आलोचना करने के बारे में पर्याप्त जानकारी नहीं है (आपको कुछ गलत सिखाए जाने के अलावा)। –

+0

@ चार्ल्स: हालांकि, यह http://stackoverflow.com/questions/781668/char-to-int-conversion-in-c का डुप्लिकेट है। –

उत्तर

7

जबकि आपको शायद इसे हाथ से घुमाए गए strtol (मानक पुस्तकालय के लिए है) के हिस्से के रूप में इसका उपयोग नहीं करना चाहिए, इस तकनीक के साथ एक अंक को अपने मूल्य में बदलने के लिए कुछ भी गलत नहीं है। यह सरल और स्पष्ट, यहां तक ​​कि मूर्खतापूर्ण है। आप, हालांकि, सीमा जाँच जोड़ने अगर तुम बिल्कुल निश्चित है कि दिए गए char सीमा में है नहीं कर रहे हैं चाहिए।

यह एक सी भाषा गारंटी नहीं है कि यह काम करता है।

5.2.1/3 का कहना है:

दोनों में स्रोत और निष्पादन बुनियादी वर्ण सेट, उपरोक्त सूची [में 0 के बाद हर किरदार का मूल्य अनुक्रम में शामिल हैं: 0,1,2,3 , 4,5,6,7,8,9] एक से अधिक होगा कि पिछले के मूल्य।

कैरेक्टर सेट मौजूद हो सकते हैं जहां यह सत्य नहीं है लेकिन इन्हें किसी भी सी कार्यान्वयन में स्रोत या निष्पादन चरित्र सेट के रूप में उपयोग नहीं किया जा सकता है।

3

संपादित करें: स्पष्ट रूप से सी मानक लगातार 0-9 अंकों की गारंटी देता है।

ASCII यह गैर पोर्टेबल बनाने प्रभाव में सी मानक द्वारा इसकी गारंटी नहीं है,। आप atoi के रूप में इस तरह के रूपांतरण के लिए लक्षित एक मानक पुस्तकालय समारोह, का उपयोग करना चाहिए। हालांकि, अगर आप जहाँ आप चल रहे हैं के बारे में मान्यताओं करना चाहते हैं (उदाहरण के लिए, एक एम्बेडेड सिस्टम जहां अंतरिक्ष एक प्रीमियम पर है), तो हर तरह से घटाव विधि का उपयोग करें। यहां तक ​​कि नहीं सिस्टम US-ASCII कोड पेज में पर (UTF-8, अन्य कोड पृष्ठों) इस रूपांतरण काम करेंगे। यह EBCDIC (आश्चर्यजनक) पर काम करेंगे।

+0

मैं atoi() यहां मदद नहीं करेगा, क्योंकि यह "3" से 3 में परिवर्तित होगा, एसिसी कोड के लिए नहीं। मुझे यह भी नहीं लगता कि यह "ए" को अपने ASCII – Uri

+1

atoi() में परिवर्तित करेगा, एक ही चरित्र पर काम नहीं करेगा, इसे एक नल-टर्मिनेटेड स्ट्रिंग की आवश्यकता है। –

+3

एएससीआई की गारंटी नहीं है लेकिन तथ्य यह है कि '0' से '9' के मान लगातार पूर्णांक हैं। –

0

सी कक्षाओं में यह एक आम चाल है जो प्राथमिक रूप से इस धारणा को स्पष्ट करती है कि एक char एक संख्या है और इसका मान संबंधित int से अलग है।

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

आम तौर पर, इस कोड को गैर- ASCII प्लेटफार्मों के लिए पोर्टेबल नहीं है, और अन्य एन्कोडिंग को भविष्य बदलाव के लिए। यह भी वास्तव में पठनीय नहीं है। कम से कम एक समारोह में इस चाल को लपेटें।

+2

यह * गैर-ASCII प्लेटफार्मों के लिए पोर्टेबल है क्योंकि यह एक भाषा आवश्यकता है कि मूल्य '0' से '9' लगातार हैं। –

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