2014-09-17 16 views
7

मुझे यकीन नहीं है कि निम्न कोड कैसे काम करता है। मैंने सोचा कि आपको {'h', 'e' ...etc...} करना है लेकिन ऐसा लगता है कि यह ठीक काम करता है। दूसरी तरफ यदि आप std::array<const char* करते हैं तो यह केवल सरणी में एक तत्व जोड़ता है। स्ट्रिंग शाब्दिक प्रारंभिक के लिए विशेष नियम हैं?std :: array startizer char के लिए कैसे काम करता है?

std::array<char, strlen("hello world!") + 1> s = {"hello world!"}; 
for (size_t i = 0; i < s.size(); ++i) 
{ 
    std::cout << s[i]; 
} 

उत्तर

4

कक्षा std::array एक कुल है। इस कथन में:

std::array<char, strlen("hello world!") + 1> s = {"hello world!"}; 

सूची प्रारंभिकरण का उपयोग किया जाता है। वर्ग std::array के इस तत्कालता के पहले और एकमात्र तत्व के रूप में एक वर्ण सरणी है जिसे स्ट्रिंग अक्षर के साथ प्रारंभ किया जा सकता है।

यह समारोह strlen के बजाय sizeof ऑपरेटर का उपयोग करने के लिए अधिक सही ढंग से होगा:

std::array<char, sizeof("hello world!")> s = {"hello world!"}; 

इसके अलावा, आप

std::array<char, sizeof("hello world!")> s = { { "hello world!" } }; 

लिख सकता है क्योंकि बदले में चरित्र सरणी एक समग्र है।

सी ++ स्टैंडर्ड

8.5.2 चरित्र सरणियों [dcl.init.string]

1 संकीर्ण चरित्र प्रकार (3.9.1), char16_t सरणी, char32_t सरणी की एक सरणी के अनुसार

, या wchar_t सरणी को एक संकीर्ण स्ट्रिंग शाब्दिक, char16_t स्ट्रिंग शाब्दिक, char32_t स्ट्रिंग शाब्दिक, या विस्तृत स्ट्रिंग शाब्दिक, या उचित रूप से टाइप की गई स्ट्रिंग शाब्दिक ब्रेसिज़ (2.14.5) में संलग्न किया जा सकता है। स्ट्रिंग अक्षर के मान के लगातार वर्ण सरणी के तत्वों को प्रारंभ करते हैं।

[उदाहरण: char msg [] = "लाइन% s पर सिंटेक्स त्रुटि \ n";

0

यहाँ इस

// GOAL 
std::array<char, sizeof("Hello")> myarray = {"Hello"}; 

यानी प्राप्त करने का एक तरीका है।

#include <iostream> 
#include <array> 

using std::cout; 
using std::ostream; 

template<typename T, size_t N> 
std::ostream& std::operator<<(std::ostream& os, array<T, N> arr) 
{ 
    { 
    size_t cnt = 0; 
    char strchar[2] = "x"; 
    for (const T& c : arr) { 
     strchar[0] = c; 
     os << "arr[" << cnt << "] = '" << (c == '\0' ? "\\0" : strchar /*string(1, c)*/ ) << "'\n" 
     << '.' << c << '.' << '\n'; 
     ++cnt; 
    } 
    } 
    return os; 
} 


#define STD_CHAR_ARRAY_INIT(arrayname, string_literal) /*std::array*/<char, sizeof(string_literal)> arrayname = {string_literal} 

int main() 
{ 
    std::array STD_CHAR_ARRAY_INIT(myarray, "Hello"); 
    cout << myarray << '\n'; 
    return 0; 
} 
: आरंभ std :: एक स्ट्रिंग शाब्दिक (एक मैक्रो हाँ, यह प्रयोग किया जाता है) के साथ सरणी

// SOLUTION 
#define STD_CHAR_ARRAY_INIT(arrayname, string_literal) /*std::array*/<char, sizeof(string_literal)> arrayname = {string_literal} 
std::array STD_CHAR_ARRAY_INIT(myarray, "Hello"); 

यहाँ कुछ परीक्षण कोड है

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