2011-01-23 10 views
8

मुझे लगता है कि यह वास्तव में मूर्ख सवाल है, लेकिन मुझे कहीं भी जवाब नहीं मिल रहा है!एक चार सरणी का हिस्सा प्राप्त करें

क्या एक चार सरणी से वर्णों का समूह प्राप्त करना संभव है? नीचे कुछ छद्म कोड फेंकने के लिए:

char arry[20] = "hello world!"; 
char part[10] = arry[0-4]; 
printf(part); 

उत्पादन:

hello 

तो, मैं पाशन और उन्हें चार-से-चार हो रही है या परिवर्तित किए बिना इस तरह एक सरणी से वर्ण का एक खंड मिल कर सकते हैं तारों के लिए तो मैं substr() का उपयोग कर सकते हैं?

उत्तर

15

संक्षेप में, नहीं। सी-शैली "तार" बस उस तरह से काम नहीं करते हैं। आपको या तो मैन्युअल लूप, या strncpy() का उपयोग करना होगा, या इसे C++ std::string कार्यक्षमता के माध्यम से करना होगा। यह देखते हुए कि आप सी ++ में हैं, आप सी ++ तारों के साथ सबकुछ भी कर सकते हैं!

साइड-टिप्पणी

ऐसा होता है, अपने विशिष्ट उदाहरण आवेदन के लिए, तो आप इस बस printf() द्वारा की पेशकश की कार्यक्षमता के माध्यम से प्राप्त कर सकते हैं:

printf("%.5s\n", arry); 
+0

ठीक है, यह बहुत बुरा है। ओह ठीक है, मैं स्ट्रिंग में परिवर्तित कर सकता हूं, मैं बस सोच रहा था कि क्या और अधिक ... सुरुचिपूर्ण समाधान था। और मैं बाद में उपयोग करने के लिए चार सरणी के भाग को ट्रिम कर रहा हूं, इसलिए प्रिंटफ़ की क्षमताओं का उपयोग करके इसे हल नहीं किया जाएगा। लेकिन वैसे भी उस tidbit के लिए धन्यवाद, मुझे इसके बारे में पता नहीं था और यह आसान हो सकता है! – Curlystraw

+0

@Curlystraw: @ म्यू-रस का जवाब नीचे सी ++ तारों का उपयोग करता है, और यदि आप मुझसे पूछें तो बहुत सुंदर सुरुचिपूर्ण है! 'Printf' भेद्यता के लिए –

14

आप memcpy (या strncpy) इस्तेमाल कर सकते हैं एक सबस्ट्रिंग प्राप्त करने के लिए:

memcpy(part, arry + 5 /* Offset */, 3 /* Length */); 
part[3] = 0; /* Add terminator */ 

दूसरे पर अपने कोड का पहलू, ध्यान दें कि printf(str)str में अविश्वसनीय इनपुट शामिल होने पर प्रारूप स्ट्रिंग भेद्यताएं हो सकती हैं।

+0

+1। –

4

जैसा ओली ने कहा, आपको सी ++ std::string कार्यक्षमता का उपयोग करने की आवश्यकता होगी। आपके उदाहरण में:

std::string hello("Hello World!"); 
std::string part(hello.substr(0, 5)); // note it's <start>, <length>, so not '0-4' 

std::cout << part; 
+6

यह 'std :: स्ट्रिंग भाग (हैलो, 0, 5) हो सकता है;' ... –

0

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

struct SubArray 
{ 
    SubArray(const char* a, unsigned s, unsigned e) 
     :arrayOwnedElseWhere_(a), 
     start_(s), 
     end_(e) 
    {} 
    const char* arrayOwnedElseWhere_; 
    unsigned start_; 
    unsigned end_; 
    void print() 
    { 
     printf_s("%.*s\n", end_ - start_ + 1, arrayOwnedElseWhere_ + start_); 
    } 
}; 
संबंधित मुद्दे