2015-12-14 2 views
22

मैं काफी सेल्सियस तक ++ नया हूँ और इस तरह बातें सीखने की गई है:मैं सी ++ में तारों के बीच सीन का उपयोग कैसे करूं?

cout << "My age is: "; 
cin >> age; 

CIN साथ चारों ओर खिलवाड़, मैं एक अवरोध भर में आ गए हैं।

कहें कि मैं लिखना चाहता हूं "मैं एक्स साल का हूँ!"।

"x" cin >> उम्र;

मैं इस तरह कोड लिखता हूं।

cout << "I am "; 
cin >> age; 
cout << "years old!"; 

रोडब्लॉक यह है कि यह एक लाइन ब्रेक उत्पन्न करता है।

मुझे लाइन ब्रेक नहीं चाहिए।

मेरे पास यह सब एक पंक्ति पर कैसे रह सकता है?

+4

की तरह कर सकते हैं यह मेरे लिए बहुत मतलब नहीं है। क्या आपको पहले * उपयोगकर्ता को आयु इनपुट करने के लिए नहीं कहना चाहिए और फिर 'std :: cout << "मैं हूं" << x << "वर्ष पुराना। \ N" 'पूरी तरह से? – 5gon12eder

+0

तो क्या आप किसी रिक्त स्थान के साथ आने की कोशिश कर रहे हैं जिसमें उपयोगकर्ता अपनी उम्र इनपुट कर सकता है? यदि ऐसा है, दुर्भाग्यवश, ऐसा नहीं है कि टेक्स्ट-आधारित सिस्टम आम तौर पर कैसे काम करते हैं, लेकिन मुझे यकीन है कि यह [ncurses] (https://en.wikipedia.org/wiki/Ncurses) के साथ किया जा सकता है, हालांकि यह और अधिक हो जाएगा उलझा हुआ। – Numeri

+1

किसी नई लाइन के बिना कुछ इनपुट करने का तरीका स्ट्रीम पर बफरिंग बंद करना है। लेकिन यह इस बात पर निर्भर करता है कि आप किस ओएस का उपयोग कर रहे हैं और सी ++ का हिस्सा नहीं है। उदाहरण के लिए विंडोज़ में आप स्क्रीन पर उन्हें प्रतिबिंबित किए बिना अक्षर प्राप्त कर सकते हैं और फिर बाद में तय कर सकते हैं कि स्क्रीन पर कौन से लोग डालेंगे। –

उत्तर

8
unsigned int age; 
std::cin >> age; 

std::cout << "I am " << age << " years old!" << std::endl; 
+0

यह समस्या का समाधान करने के लिए केवल एक ही तरीका है, समाधान नहीं। – FalconUA

+3

क्या? यह समझ में नहीं आता है ... – erip

+0

प्लस वन 'std :: endl' का उपयोग करने वाला एकमात्र व्यक्ति होने के लिए और \ n' – Mawg

11

cin कंसोल पर एक नई लाइन दर्ज करने के बाद इनपुट पढ़ता है।

इसलिए एकमात्र तरीका यह है कि आप इसे लगातार कर सकते हैं उपयोगकर्ता को उनकी उम्र के लिए संकेत देना है और फिर इसे लिखना है।

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

std::cout << "Enter your age> "; 
std::cin >> age; 
std::cout << "I am " << age << " years old" << std::endl; 
+1

क्या आप नई लाइन चीज़ के बाद संदर्भित कर सकते हैं? – dhein

22

मुझे लगता है कि आप वास्तव में इनपुट अंतिम उत्पादन के साथ साथ लाइन में होना चाहता हूँ। थोड़ा अधिक मुश्किल है पहले, उदा मूल्य पढ़ सकते हैं और फिर इसे प्रिंट .:

std::cout << "how old are you? "; 
std::cin >> x; 
std::cout << "I am " << x << " years old\n"; 

इनपुट जो उत्पादन के साथ कतार में है के साथ काम: अन्यथा, समाधान तुच्छ है। यहां मुद्दा यह है कि कंसोल हैंडलिंग वास्तव में सिस्टम द्वारा की जाती है, न कि भाषा द्वारा। नतीजतन, डेटा दर्ज करते समय एक नई लाइन के लिए इंतजार करना आवश्यक है। कंसोल द्वारा नई लाइन को संभाला जाएगा और एक लाइन ब्रेक बनाया जाएगा। इस व्यवहार को अक्षम करने के लिए कंसोल व्यवहार पर निर्भर रहने के लिए काम करना आवश्यक है। ऐसा करने का कोई मानक सी ++ तरीका नहीं है।

मुझे नहीं पता कि विंडोज़ पर कंसोल नियंत्रण से कैसे निपटें: मैं मुख्य रूप से यूनिक्स प्रोग्रामर हूं। यूनिक्स सिस्टम पर आप इनपुट मोड को गैर-कैनोलिक (यानी ICANON बिट साफ़ करने के लिए) सेट करने के लिए tcgetattr() और tcsetattr() का उपयोग करेंगे। आवश्यक फ़ाइल डिस्क्रिप्टर मानक इनपुट के लिए बस एक है, यानी, 0

एक बार कंसोल गैर-कैननिकल मोड का उपयोग कर रहा है, तो सभी महत्वपूर्ण प्रेस तुरंत एप्लिकेशन पर अग्रेषित की जाती हैं और कोई स्क्रीन इको नहीं किया जाता है। नतीजतन, रीडिंग फ़ंक्शन को वास्तव में अलग-अलग वर्णों को प्रतिबिंबित करने की आवश्यकता होगी और उसके बाद आगे एक पार्सिंग फ़ंक्शन पर जाना होगा। ऐसा करने का सबसे आसान तरीका फ़िल्टरिंग स्ट्रीम बफर बनाना है जो चरित्र को अग्रेषित करते समय std::cin से std::cout के लिए आवश्यक प्रतिध्वनि करता है। हालांकि, उन सभी को एक साथ काम करना थोड़ा सा काम है ...

डेमो पकाने पर मैंने देखा कि मुझे प्रतिध्वनि से निपटने के लिए भी आवश्यक है (जब उपयोगकर्ता एंटर कुंजी का उपयोग करता है तो एक नई लाइन से बचने के लिए)। कंसोल झंडे को रीसेट करना भी महत्वपूर्ण है क्योंकि उनमें से कुछ प्रोग्राम समाप्त होने के बाद भी वास्तव में बदलते रहते हैं।बिट्स साथ रखते समय एक कार्यान्वयन, लेकिन अभी भी कमी त्रुटि हैंडलिंग ऐसा दिखाई दे सकता:

#include <iostream> 
#include <ctype.h> 
#include <termios.h> 

struct non_canon_buf 
    : std::streambuf { 
    char buffer; 
    non_canon_buf() { 
     termios flags = {}; 
     tcgetattr(0, &flags); 
     flags.c_lflag &= ~(ICANON | ECHO); 
     tcsetattr(0, TCSANOW, &flags); 
    } 
    ~non_canon_buf() { 
     termios flags = {}; 
     tcgetattr(0, &flags); 
     flags.c_lflag |= ICANON | ECHO; 
     tcsetattr(0, TCSANOW, &flags); 
    } 
    int underflow() { 
     if (std::cin.get(buffer)) { 
      this->setg(&buffer, &buffer, &buffer + 1); 
      if (!std::isspace(static_cast<unsigned char>(buffer))) { 
       std::cout << buffer << std::flush; 
      } 
      return std::char_traits<char>::to_int_type(buffer); 
     } 
     return std::char_traits<char>::eof(); 
    } 
}; 

int main() 
{ 
    non_canon_buf sbuf; 
    std::istream in(&sbuf); 
    std::cout << "I am "; 
    int age = 0; 
    in >> age; 
    std::cout << " years old\n"; 
    if (!in) { 
     std::cout << "ERROR: failed to enter a valid age!\n"; 
    } 
} 
+2

बस पूर्णता के लिए, विंडोज समकक्ष ''SetConsoleMode'] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms686033.aspx)' ENABLE_LINE_INPUT' और 'ENABLE_ECHO_INPUT' अक्षम के साथ होगा। फिर ['ReadConsole'] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms684958.aspx) (या stdin के साथ 'ReadFile') का उपयोग किया जा सकता है। – Bob

+1

@Mawg हालांकि यह एक आधिकारिक स्रोत नहीं हो सकता है, [cppreference.com] (http://en.cppreference.com/w/cpp/io/manip/endl) में 'std :: endl' के बारे में एक नोट है जो कहता है "कुछ स्रोतों द्वारा प्रोत्साहित '\ n' के स्थान पर std :: endl का उपयोग, आउटपुट प्रदर्शन को काफी हद तक खराब कर सकता है।" तो हो सकता है कि '\ n' के साथ क्या हो। – Alex

+1

@Mawg: '\ n' पूरी तरह मान्य सी ++ है। आप 'std :: endl' पसंद कर सकते हैं, लेकिन आपको किसी भी उत्तर में स्टैक ओवरफ़्लो टिप्पणियों को स्पैम नहीं करना चाहिए जो आपके द्वारा नापसंद कोडिंग सम्मेलन का उपयोग करता है। साथ ही, ध्यान दें कि '\ n' और 'std :: endl' तकनीकी रूप से वही काम नहीं करता है, जैसा कि एलेक्स के लिंक में बताया गया है। – FrederikVds

6

आप क्या आप शुद्ध सी में चाहते ++ नहीं कर सकते। आप के रूप में दूसरों का सुझाव दिया है और लाइन पुनर्मुद्रण कर सकते हैं:

std::cout << "I am " << age << " years old!\n" 

या आप कंसोल आउटपुट स्पष्ट करने के लिए एक OS-विशेष समारोह का उपयोग कर सकते हैं। Read about this here

उदाहरण के लिए, आप उपयोगकर्ता के लिए पूछने के बाद कंसोल को साफ़ करने के लिए, Windows के लिए system("cls"); का उपयोग कर सकते हैं।

#include <stdlib.h> 

int main(int argc, char* argv[]) { 
    unsigned int age; 
    std::cout << "My age is: " 
    std::cin >> age; 
    system("cls"); 
    std::cout << "I am " << age << " years old!\n" 
    ... 
} 

पैदावार:

C:>AgeProgram.exe I am 10 years old

+0

@Mawg 'std :: endl'' cout' buffer flushes। बहुत कम मामलों में आप वास्तव में यह चाहते हैं। '" \ n "' और 'endl' हर दूसरे सम्मान में समान हैं। [इसे पढ़ें।] (Http://stackoverflow.com/questions/213907/c-stdendl-vs-n) –

0

आप इस

int user_age; 

std:cout<<"Enter Your Age:"   //Ask user for age 

std::cin >>user_age;    //Read user input 
std::cout<<"I am"<<user_age<<"years old!"<< std::endl; //finlly display the value 
संबंधित मुद्दे