std :: रिक्त स्थान के साथ सिनेमा इनपुट?


144
#include <string>

std::string input;
std::cin >> input;

उपयोगकर्ता "हैलो वर्ल्ड" दर्ज करना चाहता है। लेकिन cinदो शब्दों के बीच के स्थान पर विफल रहता है। मैं cinपूरे में कैसे ले सकता हूँ Hello World?

मैं वास्तव में स्ट्रक्चर्स के साथ ऐसा कर रहा हूं और cin.getlineकाम नहीं कर रहा हूं । यहाँ मेरा कोड है:

struct cd
{
    std::string CDTitle[50];
    std::string Artist[50];
    int number_of_songs[50];
};

std::cin.getline(library.number_of_songs[libNumber], 250);

यह एक त्रुटि देता है। कोई विचार?


27
आपको उस तरह के नए प्रश्न पूछने के लिए अपने प्रश्नों को संपादित नहीं करना चाहिए। कारण यह है कि लोगों ने पहले ही आपके मूल प्रश्न के उत्तर दे दिए हैं और अब वे उत्तर संदर्भ से बाहर लग रहे हैं। यदि आपका मूल प्रश्न पहले ही उत्तर दे दिया गया है तो भ्रम से बचने के लिए एक नया प्रश्न शुरू करें।
पीट

यह एक छोटी परीक्षा के बाद स्पष्ट है, लेकिन क्या आप कृपया चर के लिए एक घोषणा जोड़ सकते हैं libraryताकि यह स्पष्ट हो कि यह प्रकार का हैcd
chandsie

माफ करना, दोस्तों, यह जल्दबाजी में किया गया था, मैं इसे दोहराऊंगा।
नींबू

1
यदि आप इसे प्रतिस्थापन के माध्यम से पुन: उत्पन्न करने जा रहे हैं, तो कृपया एक मॉड द्वारा विलोपन के लिए प्रश्न को चिह्नित करें।
को ऑर्बिट

2
अपने अद्यतन में, आप getlineएक में प्रयास कर रहे हैं int। बेशक वह विफल है।
बेन वोइगट

जवाबों:


102

आपको उपयोग करना होगा cin.getline():

char input[100];
cin.getline(input,sizeof(input));

7
@ केविन मेह, ऐसा होता है। C ++ बिल्कुल उतना सहज नहीं है जितना हम इसे पसंद करेंगे।
पीट

61
ew; क्यों char-बफर्स ​​का उपयोग करें? यह 2011 है।
लाइटनेस दौड़ ऑर्बिट

3
और उपयोग क्यों नहीं cin.getline(input, sizeof(input));? इसके अलावा, क्या आपको रिटर्न की स्थिति की जांच नहीं करनी चाहिए?
जोनाथन लेफ्लर

2
@JonathanLeffler उस समय यह लिखा गया था, यह मेरे पास उस प्रश्न के लिए था जो मूल रूप से पूछा गया था (वास्तविक प्रश्न के लिए पहली टिप्पणी देखें और आप देखेंगे कि संदर्भ ओपी द्वारा संपादित किए जाने के कारण बदल गया था)। किसी भी तरह से, अगर आपको लगता है कि इसका उत्तर यह भयानक है, तो इसे दरकिनार कर दें। मैं स्वीकार करता हूं कि यह "सबसे अच्छा" समाधान नहीं हो सकता है, लेकिन यह एक समाधान है कम नहीं। यह पूछने के बजाय कि मैंने किसी चीज़ का उपयोग क्यों नहीं किया, आप हमें यह सब बता सकते हैं कि हमें इसे क्यों करना चाहिए।
पीट

7
आपका उत्तर भयानक नहीं है और उसे नीचा दिखाने की आवश्यकता नहीं है। मुझे लगता है कि दो छोटे बदलावों से इसमें सुधार होगा। sizeof(input)कॉल 1 में 100 के स्थान पर 1 का उपयोग करेगा cin.getline(); इसका मतलब है कि आप इनपुट बफर के आकार को बदल सकते हैं और केवल दो लाइनों के बजाय एक पंक्ति को बदलने की आवश्यकता है। चेंज 2 ओपी को यह याद दिलाने के लिए कि cin.getline()उदाहरण के लिए, if (!cin.getline(input, sizeof(input))) { ...handle EOF or error... }या कुछ इसी तरह के उपयोग से रिटर्न का परीक्षण करना होगा , विशेष रूप से, इनपुट ऑपरेशन अप्रत्याशित व्यवहार के प्रति संवेदनशील होते हैं। अन्य उत्तरों को भी इसकी आवश्यकता है।
जोनाथन लेफ़लर

215

यह "विफल" नहीं है; यह सिर्फ पढ़ना बंद कर देता है। यह एक लेक्सिकल टोकन को "स्ट्रिंग" के रूप में देखता है।

उपयोग करें std::getline:

int main()
{
   std::string name, title;

   std::cout << "Enter your name: ";
   std::getline(std::cin, name);

   std::cout << "Enter your favourite movie: ";
   std::getline(std::cin, title);

   std::cout << name << "'s favourite movie is " << title;
}

ध्यान दें कि यह वही नहीं है std::istream::getline, जो एस के charबजाय सी-स्टाइल बफ़र्स के साथ काम करता है std::string

अपडेट करें

आपका संपादित प्रश्न मूल से थोड़ा समानता रखता है।

आप एक स्ट्रिंग या चरित्र बफर में नहीं, getlineएक में जाने की कोशिश कर रहे थे int। धाराओं के प्रारूपण कार्य केवल operator<<और साथ काम करते हैं operator>>। या तो उनमें से एक का उपयोग करें (और बहु-शब्द इनपुट के अनुसार ट्वीक करें), या उपयोग करें getlineऔर शाब्दिक रूप से intबाद के तथ्य में परिवर्तित करें ।


2
मुझे यह उत्तर स्वीकार किए गए से बेहतर लगता है, क्योंकि मुझे चरित्र की लंबाई निर्दिष्ट करने की आवश्यकता नहीं है।
द वेंडर

1
@ वास्तव में, यह एक महत्वपूर्ण लाभ है।
ऑर्बिट से

स्ट्रेचर को शामिल करना न भूलें: #include <sstream>
GilbertS

@LightnessRacesinOrbit, क्या आप कृपया मदद कर सकते हैं? यह मेरे आउटपुट को प्रिंट करते हुए मुझे बिना किसी कारण के एक अतिरिक्त न्यूलाइन देता है।
अंशुमान कुमार

@AshshumanKumar मुझे लगता है कि getlineयह वापस आने वाली स्ट्रिंग में समाप्त होने वाली न्यूलाइन को शामिल कर सकता है। यदि हां, तो इसे हटाना आपके ऊपर है।
मार्क रैनसम

31

स्टैंडर्ड लाइब्रेरी नामक एक इनपुट फंक्शन प्रदान करता है ws, जो एक इनपुट स्ट्रीम से व्हॉट्सएप का उपभोग करता है। आप इसे इस तरह से उपयोग कर सकते हैं:

std::string s;
std::getline(std::cin >> std::ws, s);

4
मुझे लगता है कि यह अब तक का सबसे अच्छा जवाब है। मैं इसे std :: cin >> के साथ ऊपर जोड़ सकता हूं।
आंद्रा

1
अब तक का सबसे अच्छा जवाब। उपयोग करते समय std::getline(std::cin, s)मैं बहुत गड़बड़ हो जाता हूं और मैं कहता हूं, जब एक while/ forलूप में इनपुट की प्रतीक्षा में इनपुट बाधित हो । इस विकल्प ने मेरी समस्या हल कर दी!
omerowitz

स्पस्ट को शामिल करें: #include <sstream>
GilbertS

24

उपयोग :

getline(cin, input);

समारोह में पाया जा सकता है

#include <string>

2
+1 यह एकमात्र उत्तर है जो वास्तव में मेरे लिए काम करता है। बाकी के जवाब Cin.getline () का उपयोग करने के लिए कहते हैं, लेकिन मुझे सिर्फ यह कहते हुए एक त्रुटि दी कि फ़ंक्शन मौजूद नहीं है।
ब्‍लम्‍बो

7
@blembo: वाक़ई? क्योंकि मेरा जवाब, इस एक से तीन साल पहले पोस्ट किया गया था, ठीक वही बात कहता है (जैसा कि आप जो कहते हैं, उसके विपरीत)।
को ऑर्बिट

@blembo: और यदि cin.getlineआपके सिस्टम पर मौजूद नहीं है, तो आपने कुछ गलत किया है। सबसे अधिक संभावना है कि आप गलत तर्क पारित कर रहे थे। अपनी गलतियों के लिए दूसरों को दोषी नहीं ठहराने के लिए ...
ऑर्बिट

13

आप .get में फ़ंक्शन का उपयोग करना चाहते हैं।

#include <iostream>
using namespace std;

int main () {
  char name[256], title[256];

  cout << "Enter your name: ";
  cin.getline (name,256);

  cout << "Enter your favourite movie: ";
  cin.getline (title,256);

  cout << name << "'s favourite movie is " << title;

  return 0;
}

यहाँ से उदाहरण लिया । अधिक जानकारी और उदाहरणों के लिए इसे देखें।


12
वास्तव में, आप शायद ही कभी सदस्य का उपयोग करना चाहते हैं- getline। इसका प्रकोप हुआ है। getlineइसके बजाय मुफ्त का उपयोग करें , जिसका उपयोग किया जा सकता है std::string। [BTW, cplusplus.com अनुशंसित संसाधन नहीं है]
को ऑर्बिट

1
@Tomalak क्यों है cplusplus.com की सिफारिश नहीं? मैं इसे हर समय उपयोग करता हूं: पी
नींबू

6
@ केविनड्यूक: ट्यूटोरियल भ्रामक और गलत हो सकते हैं, और संदर्भ में त्रुटियों की भीड़ होती है। ये अच्छे संसाधन हैं।
को ऑर्बिट

1
@NickSweeting: हाँ; इसके बजाय इसका उपयोग करें
ऑर्बिट

1
प्रलेखन लिंक के लिए, cppreference.com cplusplus.com के लिए एक प्रभावी प्रतिस्थापन है (दोनों गैर-आधिकारिक पैराप्रैसेस हैं)
बेन Voigt

4

सी रास्ता

आप getscstdio (stdio.h in c) में पाए गए फ़ंक्शन का उपयोग कर सकते हैं :

#include<cstdio>
int main(){

char name[256];
gets(name); // for input
puts(name);// for printing 
}

C ++ WAY

gets c ++ 11 में हटा दिया गया है।

[अनुशंसित]: आप getline (cin, name) का उपयोग कर सकते हैं जो कि string.h या cin.getline (नाम, 256) में है जो कि iostreamअपने आप में है।

#include<iostream>
#include<string>
using namespace std;
int main(){

char name1[256];
string name2;
cin.getline(name1,256); // for input
getline(cin,name2); // for input
cout<<name1<<"\n"<<name2;// for printing
}

10
बहुत बुरी सलाह, getsसुरक्षित रूप से उपयोग करना असंभव है। यह भी पूरी तरह से C11 में हटा दिया गया है।
Mat

1

मैं इनपुट प्राप्त करने के लिए निम्नलिखित विधि का उपयोग करता हूं:

#include <iostream>
#include <string>

using namespace std;

int main(void) {
    string name;

    cout << "Hello, Input your name please: ";
    getline(cin, name);

    return 0;
}

यह वास्तव में एक स्ट्रिंग के लिए सरणी की कुल लंबाई को परिभाषित करने के बजाय उपयोग करने के लिए सुपर आसान है जिसमें एक अंतरिक्ष चरित्र होता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.