2013-08-13 5 views
5

मैं अभी भी मंच के लिए नया हूं इसलिए मैं फोरम - शिष्टाचार के मुद्दों के लिए पहले से माफ़ी मांगता हूं।int/char arrays/तारों के बीच अंतर

मुझे int सरणी और char सरणी के बीच अंतर को समझने में समस्या हो रही है।

मैं हाल ही में एक परियोजना यूलर समस्या यह है कि मूल रूप से एक char सारणी का प्रयोग किया संख्या की एक स्ट्रिंग को स्टोर करने के लिए एक कार्यक्रम लिखा था, और बाद में विशिष्ट वर्ण कहा जाता है और एक उत्पाद का पता लगाने के लिए उन पर int आपरेशन का उपयोग करने की कोशिश की। जब मैंने एक चार स्ट्रिंग का उपयोग किया तो मुझे एक हास्यास्पद रूप से बड़ा उत्पाद मिला, स्पष्ट रूप से गलत। यहां तक ​​कि अगर मैंने परिवर्तित किया जो मैंने सोचा था कि एक वर्ण (str[n]) के रूप में एक पूर्णांक इनलाइन ((int)str[n]) में संकलित किया जाएगा, तो यह वही काम करता है। केवल जब मैंने वास्तव में एक पूर्णांक सरणी का उपयोग किया तो यह काम करता था।

कोड के रूप में char स्ट्रिंग

char str[21] = "73167176531330624919"; 

यह काम नहीं किया के लिए

इस प्रकार है। मुझे जवाब के लिए लगभग 1.5 ट्रिलियन का जवाब मिला जो लगभग 40k होना चाहिए था।

int सरणी

int str[] = {7,3,1,6,7,1,7,6,5,3,1,3,3,0,6,2,4,9,1,9}; 

यह काम किया है क्या है के लिए

। मैंने इन-लाइन प्रकार कास्टिंग भी बंद कर दिया।

कोई भी स्पष्टीकरण कि इन चीजों ने क्यों काम किया/काम नहीं किया और कुछ भी जो इन विचारों की बेहतर समझ के लिए नेतृत्व कर सकते हैं, की सराहना की जाएगी। सहायक सामान के लिए लिंक भी हैं। मैंने अपने आप पर तारों और सरणी और पॉइंटर्स का बहुत कुछ शोध किया है (मैं स्वयं को हाईस्कूल में पढ़ाया जाता हूं) लेकिन अवधारणाएं अभी भी उलझन में हैं।

साइड सवाल, सी में स्ट्रिंग स्वचालित रूप से सरणी के रूप में संग्रहीत हैं या क्या ऐसा करना संभव है?

+3

शायद [यह तालिका] (http://www.asciitable.com) असीसी वर्णों के आपके उपचार पर 'int' मानों के रूप में कुछ प्रकाश डाल सकती है। और हां, यदि 'सरणी' से आप अंतर्निहित चरित्र डेटा युक्त संगत स्मृति का मतलब रखते हैं, तो उन्हें इस तरह से संग्रहीत किया जाता है (एक अंतर्निहित 0-टर्मिनेटर पर लगाया जाता है)। – WhozCraig

+0

क्या वह तालिका कहती है कि चार '0' 48 के int मान के अनुरूप है? – Charles

+0

हां, हालांकि मान हस्ताक्षरित है, जो महत्वपूर्ण प्रतीत नहीं हो सकता है लेकिन ऐसा होगा यदि आपको विस्तारित एसीआईआई अक्षरों को संभालने की आवश्यकता है (उस तालिका को तुरंत नीचे देखें)। आप सही रास्ते पर हैं। नीचे दिए गए कई उत्तर इस बेहतर वर्णन करते हैं। ध्यान दें कि यह ('0' == 48) केवल ASCII के लिए सच है। अन्य सिस्टम-निर्भर चरित्र सेट (जैसे कि [ईबीसीडीआईसी] (http://en.wikipedia.org/wiki/EBCDIC) हैं)। – WhozCraig

उत्तर

4

WhozCraig के उत्तर पर विस्तार करने के लिए, आपको जो परेशानी हो रही है उसे तारों के साथ नहीं करना है, लेकिन व्यक्तिगत पात्रों के साथ।

सी में स्ट्रिंग्स वर्णों के सरणी के रूप में बड़े पैमाने पर संग्रहीत हैं (चेतावनी के साथ कि अंत में एक शून्य टर्मिनेटर मौजूद है)।

वर्ण स्वयं एसिसी नामक सिस्टम में एन्कोड किए गए हैं जो अंग्रेजी भाषा (केवल) में वर्णित वर्णों के लिए 0 - 127 के बीच कोड निर्दिष्ट करता है। इस प्रकार "7" 7 के रूप में संग्रहीत नहीं है, लेकिन 7 की एसीआई एन्कोडिंग 55 है।

मुझे लगता है कि अब आप देख सकते हैं कि आपका उत्पाद इतना बड़ा क्यों हुआ। ठीक करने के लिए

एक सुरुचिपूर्ण तरीका

int num = (int) str[n]; 

को
int num = str[n] - '0'; 
//thanks for fixing, ' ' is used for characters, " " is used for strings 

यह समाधान अपने चरित्र के लिए ascii कोड से 0 के लिए ascii कोड घटा देती है परिवर्तित करने के लिए, कहते हैं कि "7" होगा। चूंकि संख्याएं रैखिक रूप से एन्कोड की गई हैं, यह काम करेगी (एकल अंक संख्याओं के लिए)।बड़ी संख्या के लिए, आपको atoi या strtolstdlib.h

+0

मुझे कोड को अपने अंकों में वापस बदलने का विचार पसंद है। जैसा कि आप कहते हैं, सुरुचिपूर्ण :) – Charles

+0

@ user2673602 धन्यवाद, खुशी है कि मैं मदद कर सकता हूं! –

+1

मैं रूपांतरणों के लिए ['strtol()'] (http://en.cppreference.com/w/c/string/byte/strtol) सुझाऊंगा, लेकिन विचार वहां है। – WhozCraig

3

स्ट्रिंग्स केवल शून्य सरणी वाले बाइट के साथ वर्ण सरणी का उपयोग करना चाहिए। सी में कोई अलग स्ट्रिंग डेटा प्रकार नहीं है।

एक चर के रूप में एक char का उपयोग करते समय, संख्यात्मक ascii मान का उपयोग किया जाता है। उदाहरण के लिए, printf("%d\n", (int)'a'); जैसे कुछ कहने से 97 ('ए' का एएससीआई मान) मुद्रित किया जाएगा।

आप संख्यात्मक गणना करने के लिए संख्याओं की एक स्ट्रिंग का उपयोग नहीं कर सकते हैं जब तक कि आप इसे एक पूर्णांक सरणी में परिवर्तित न करें। इसके पूर्णांक के रूप में एक चरित्र के रूप में एक अंकों बदलने के लिए, आप कुछ इस तरह कर सकते हैं:

char a = '2'; 
int a_num = a - '0'; 
//a_num now stores integer 2 

यह '0' (48) की ascii मूल्य का कारण बनता है ascii मूल्य से घटाया जा करने के लिए '2' (50) , अंत में इस कोड को छोड़ने 2.

2
char str[21] = "73167176531330624919" 

char str[21] = {'7','3','1','6','7','1','7','6','5',/ 
       '3','1','3','3','0','6','2','4','9','1','9'} 

में str [21] संग्रहीत इसलिए जो कुछ के बराबर है संख्या नहीं है, लेकिन चार (उनके ASCII बराबर प्रतिनिधित्व अलग है)।

साइड प्रश्न उत्तर - हां/नहीं, तार स्वचालित रूप से चार सरणी के रूप में संग्रहीत होते हैं, लेकिन स्ट्रिंग में एक अतिरिक्त वर्ण ('0') होता है जो अंतिम तत्व (जहां एक चार सरणी के पास ऐसा कोई नहीं होना चाहिए))।

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