2011-06-12 12 views
5

मैं यहाँ की तरह उपयोगकर्ता इनपुट, कुछ पढ़ना चाहते हैं:स्थान या कुछ अन्य चरित्र जोड़ने के साथ उपयोगकर्ता इनपुट कैसे पढ़ा जाए?

char *text = new char[20] ; 
cin >> text ; 

लेकिन उपयोगकर्ता में प्रवेश करती है, तो "हैलो", मैं अपने अन्य खाली पात्रों अंतरिक्ष या -, की तरह कुछ से भरा जा करना चाहते हैं:

"hello------------------------" 

मैं यह कैसे कर सकता हूं?

उत्तर

6

ऐसा करने के लिए कोई मानक और तेज़ तरीका नहीं है। मैं कुछ विकल्पों के बारे में सोच सकता हूं।


मान लीजिए हमने:

char *text = new char[20]; 
cin >> text; 

नोट - हम जरूरत पता चला है कि क्षमता 20 है! मैं आपको इसके लिए कुछ स्थिरता का उपयोग करने की सलाह दूंगा, खासकर यदि यह अन्य तारों के लिए भी उपयोग किया जाएगा।


ठीक है, पहला विकल्प - का उपयोग std::stringstream

std::stringstream ss; 
ss << setw(20 - 1) << setfill('-') << text; 
//   ^^^^ we need one byte for the '\0' char at the end 
ss >> text; 

लेकिन इस बल्कि धीमी है।


हाथ से वर्ण भरें:

int length = strlen(text); 
for(int i = length; i < 20 - 1; ++i) // again - "20-1" - '\0' 
{ 
    text[ i ] = '-'; 
} 
text[ 20 - 1 ] = '\0'; // don't forget to NULL-terminate the string 

और सबसे अच्छा तरीका है, मेरे हिसाब से - (आप के रूप में प्रश्न टैग किया है इन char* चीजों से छुटकारा पाने के) और बस std::string का उपयोग करें।

std::string sText; 
std::cin >> sText; 
sText.resize(20, '-'); // NOTE - no need to NULL-terminate anything 

देखा! (:

इस तरह और अधिक स्पष्ट है और आप delete[] से पहले अंत में delete[] text; का उपयोग कर (जो कभी कभी कि तुच्छ नहीं है, विशेष रूप से कुछ अपवाद के मामले में के बारे में ले जाने की जरूरत नहीं है - यह आप 100 दे देंगे % स्मृति रिसाव। बेशक, आप हमेशा स्मार्ट संकेत दिए गए .. लेकिन स्मार्ट संकेत इस बात के लिए उपयोग कर सकते हैं ?! :))


बेशक

, आप 20-1 के बजाय 19 लिख सकते हैं, मैं तो बस के लिए "आकर्षण" चाहता था -1, यदि आप कुछ स्थिर का उपयोग करते हैं।

+0

यदि आप '-1' को हाइलाइट करना चाहते हैं, तो क्यों न केवल' 20' के बजाय स्थिर का उपयोग करें? :) जादुई संख्या ftl। – Xeo

+0

क्योंकि यदि इस आकार का अब और उपयोग नहीं किया जाएगा, तो कोड की 2-3 पंक्तियों के लिए निरंतर जोड़ने की आवश्यकता नहीं है (जो _are_ दूसरे के बाद एक है)। या कम से कम, मैं नहीं करूँगा। ध्यान दें कि मैंने पहले से ही अन्य मामले में निरंतर उपयोग करने के लिए @ एटीए की सलाह दी है। –

0

आप इसे कई तरीकों से कर सकते हैं। (ध्यान दें कि आप 20 के साथ सरणी परिभाषित करते हैं, आप केवल 19 वास्तविक पात्रों के साथ साथ अंतिम \0 प्राप्त कर सकते हैं:

const char* dashes = "--------------------"; 

तो फिर तुम स्ट्रिंग के रूप में पढ़ा - "" उदाहरण के लिए, यदि आप एक स्ट्रिंग 19 से भरा है लगता है आप लिखते हैं:

char *text = new char[20] ; 
cin >> text ; 

और फिर आप strcat का उपयोग पात्रों के बाकी कॉपी करने के लिए कर सकते हैं, पढ़ने के लिए स्ट्रिंग की लंबाई निर्धारित करने के लिए strlen का उपयोग कर:

strcat(text, dashes + strlen(text)); 

यह पाठ में 19 - length of the text को शेष में जोड़ देगा। ध्यान दें कि मैं उस विशेष मात्रा को dashes सूचक में जोड़ता हूं।

अंत में, >> केवल एक शब्द पढ़ेगा। इनपुट की पूरी लाइन को पढ़ने के लिए आपको getline का उपयोग करना होगा।

+0

-1: यह एक आवश्यक गतिशील आवंटन बनाता है और पॉइंटर अंकगणित कुछ हद तक मुश्किल मुहावरे पर निर्भर करता है। बस डैश को बफर में कॉपी करना और पहले कुछ को पढ़ने के लिए आसान होगा। –

+0

@ करल: आप अनावश्यक गतिशील आवंटन के बारे में सही हैं, लेकिन यह मूल कोड था। बस इसे पूरा करने के लिए लिखा था। पॉइंटर्स पर मुश्किल बेवकूफ? मुझे नहीं लगता कि एक पॉइंटर जोड़ना एक मूल्य इतना मुश्किल है। पहले बफर की प्रतिलिपि बनाना भी काम नहीं करता है क्योंकि सीन उस उपयोगकर्ता इनपुट पर अंत में अंतिम '' 0'' डालता है जिसे आप निकालना चाहते हैं (और * वह * मुश्किल होगा)। –

2

आप में से कोई भी शून्य टर्मिनेटर चरित्र - '\ 0' के बारे में कुछ भी नहीं कहा। सी/सी ++ में तारों के साथ काम करते समय यह वास्तव में महत्वपूर्ण है। उदाहरण के लिए, यदि आप चाहते हैं कि आपका टेक्स्ट 20 प्रतीकों तक लंबा हो, तो आपको 21 वर्णों के लिए स्मृति आवंटित करनी चाहिए। यह सिर्फ एटा के लिए जानकारी के लिए है। और अपने प्रश्न का उत्तर है:

char *text = new char[21]; 
//start initialization 
for (int i=0;i<20;i++) { 
    text[i] = '-'; 
} 
text[20] = '\0'; 
//end initialization 
cout << "Your input: " << endl; 
cin >> text;//get the user input 
text[strlen(text)]='-';//change the automatically added '\0' with '-' 
cout << text << endl; 

ध्यान रखें कि आप भी अगर उपयोगकर्ता स्मृति आप आवंटित किया है से अधिक समय कुछ दर्ज नहीं किया गया है की जाँच करनी चाहिए में है।


संपादित करें: ठीक है, किरिल तेजी से (और अधिक सटीक) मुझ से था। :)

+0

क्या आप निश्चित हैं, कि 'std :: cin' _will not_ बाकी वर्णों को स्पर्श नहीं करेगा? मैंने शुरुआत में इस विकल्प के बारे में सोचा, लेकिन मुझे यकीन नहीं था कि मानक इस मामले में 'std :: cin' के व्यवहार की गारंटी देता है या नहीं। –

+0

इस [कथन] के अनुसार (http://stackoverflow.com/questions/805403/what-are-the-rules-of-the-stdcin-object-in-c) यह पहले सफेद अंतरिक्ष चरित्र तक पढ़ेगा, तो मुझे लगता है कि यह ठीक रहेगा। लेकिन आपका सवाल उचित है। –

+0

यह दिलचस्प है अगर यह मानक द्वारा गारंटीकृत है:? लेकिन अच्छा संदर्भ। मेरे द्वारा +1 :) वैसे, थोड़ा ऑफ-विषय - आप क्या हैं डीएसएलआर: डी –

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