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
chandie

দুঃখিত, বন্ধুরা তাড়াহুড়ো করে এসেছিল, আমি এটিকে আবার পোস্ট করব।
লেবু

1
আপনি যদি এটি প্রতিস্থাপনের মাধ্যমে পুনরায় পোস্ট করতে চলেছেন তবে দয়া করে কোনও মোড দ্বারা মুছে ফেলার জন্য প্রশ্নটি পতাকাঙ্কিত করুন।
অরবিট

2
আপনার আপডেটে, আপনি একটিতে getlineপ্রবেশ করার চেষ্টা করছেন int। অবশ্যই এটি ব্যর্থ হয়।
বেন ভয়েগট

উত্তর:


102

আপনাকে ব্যবহার করতে হবে cin.getline():

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

7
কেভিন মেহ, এটি ঘটে সি ++ হ'ল ঠিক তেমন স্বজ্ঞাত নয় like
পিট

61
ছিঃ; কেন charবাফার ব্যবহার করবেন? এটি 2011.
অরবিট

3
এবং কেন ব্যবহার cin.getline(input, sizeof(input));করবেন না ? এছাড়াও, আপনি কি রিটার্নের স্ট্যাটাস চেক করবেন না?
জোনাথন লেফলার

2
@ জোনাথনলফলার এই লেখা হওয়ার সময়, আমার কাছে এই প্রশ্নের উত্তর ছিল যা মূলত জিজ্ঞাসা করা হয়েছিল (আসল প্রশ্নের জন্য প্রথম মন্তব্যটি দেখুন এবং আপনি দেখতে পাবেন যে ওপি সম্পাদনার কারণে প্রসঙ্গটি পরিবর্তিত হয়েছিল)। যে কোনও উপায়ে, যদি আপনি উত্তরটি ভয়ানক মনে করেন তবে এটিকে কমিয়ে দিন। আমি স্বীকার করি যে এটি "সেরা" সমাধান নাও হতে পারে তবে এটির সমাধানও কম নয়। আমি কেন কিছু ব্যবহার করিনি তা জিজ্ঞাসার পরিবর্তে আমাদের এটি কেন আপনার ব্যবহার করা উচিত তা আপনি আমাদের সকলকে বলতে পারেন।
পিট

7
আপনার উত্তর ভয়ঙ্কর নয় এবং ডাউনভোটিংয়ের দরকার নেই। আমার মনে হয় দুটি ছোট পরিবর্তন এটিকে উন্নতি করবে। পরিবর্তন 1 sizeof(input)কলটিতে 100 এর জায়গায় ব্যবহার করবে 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
@ দ্য ওয়ান্ডারার প্রকৃতপক্ষে, এটি একটি উল্লেখযোগ্য সুবিধা।
অরবিটে

প্রবাহ অন্তর্ভুক্ত মনে রাখবেন: # অন্তর্ভুক্ত <স্ট্রিম>
গিলবার্টস

@ লাইটনেসেসেসিনআরবিট, আপনি কি দয়া করে সাহায্য করতে পারেন? এটি আমার আউটপুট প্রিন্ট করার সময় অকারণে আমাকে একটি অতিরিক্ত নিউলাইন দেয়।
আনুষুমান কুমার

@ অংশুমানকুমার আমার ধারণা আমি যে getlineস্ট্রিংটি ফিরিয়ে নিয়েছিলে এতে সমাপ্তি নিউলাইন অন্তর্ভুক্ত থাকতে পারে। যদি তা হয় তবে এটি মুছে ফেলা আপনার পক্ষে।
মার্ক রান্সম

31

স্ট্যান্ডার্ড লাইব্রেরি নামক একটি ইনপুট ফাংশন সরবরাহ করে ws, যা একটি ইনপুট স্ট্রিম থেকে সাদা স্থান খায়। আপনি এটি এর মতো ব্যবহার করতে পারেন:

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

4
আমি মনে করি এটি এখন পর্যন্ত সেরা উত্তর। আমি উপরের স্ট্যান্ড :: সিএন >> এর সাথে এটি একত্রিত করতে পারি।
আন্দ্রা

1
এখন পর্যন্ত সেরা উত্তর। ব্যবহার করার সময় std::getline(std::cin, s)আমি খুব অগোছালো হয়ে উঠব এবং আমি বলব, while/ forলুপের ইনপুটগুলির জন্য অপেক্ষা করার সময় বাধা ইনপুট । এই বিকল্পটি আমার সমস্যা সমাধান করেছে!
omerowitz

প্রবাহ অন্তর্ভুক্ত করুন: # অন্তর্ভুক্ত <স্ট্রিম>
গিলবার্টস

24

ব্যবহার:

getline(cin, input);

ফাংশন পাওয়া যাবে

#include <string>

2
+1 এটিই হ'ল একমাত্র উত্তর যা আসলে আমার পক্ষে কাজ করেছিল। বাকি উত্তরগুলি cin.getline () ব্যবহার করতে বলে তবে এটি কেবল ফাংশনটির অস্তিত্ব নেই বলে আমাকে ত্রুটি দিয়েছে।
blembo

7
@blembo: সত্যি? কারণ আমার উত্তর, এটির আগে তিন বছরেরও বেশি আগে পোস্ট করা হয়েছে, ঠিক একই জিনিসটি বলেছেন (আপনি যা দাবি করেছেন তার বিপরীতে)।
কক্ষপথে হালকা ঘোড়দৌড়

@blembo: এবং যদি cin.getlineআপনার সিস্টেমে উপস্থিত না থাকে তবে আপনি খুব ভুল কিছু করেছেন। সম্ভবত আপনি ভুল যুক্তি দিয়ে যাচ্ছিলেন। নিজের ভুলের জন্য অন্যকে দোষ না
দেওয়াই সেরা

13

আপনি সিনে .getline ফাংশনটি ব্যবহার করতে চান।

#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। এটা outmoded। getlineপরিবর্তে বিনামূল্যে ব্যবহার করুন, যা এর সাথে ব্যবহার করা যেতে পারে std::string। [BTW, cplusplus.com হয় না একটি প্রস্তাবিত রিসোর্স]
কক্ষপথে লঘিমা জাতি

1
@ টমলাক সিপিপ্লসপ্লাস ডটকমকে কেন সুপারিশ করা হচ্ছে না? আমি এটি সর্বদা ব্যবহার করি: পি
লেবু

6
@ কেভিনডুক: টিউটোরিয়ালগুলি বিভ্রান্তিমূলক এবং ভুল হতে পারে এবং রেফারেন্সে প্রচুর ত্রুটি রয়েছে। এগুলি হ'ল ভাল সম্পদ।
অরবিট

1
@ নিকসুইটিং: হ্যাঁ; ব্যবহার এই পরিবর্তে।
অরবিট

1
ডকুমেন্টেশন লিঙ্কগুলির জন্য, cppreferences.com সিপিপ্লসপ্লাস.কমের কার্যকর প্রতিস্থাপন (উভয়ই আন-অফিশিয়াল প্যারাফ্রেস)
বেন ভয়েগট

4

সি উপায়

আপনি getsসিএসটিডিওতে পাওয়া ফাংশনটি ব্যবহার করতে পারেন (stdio.h in c):

#include<cstdio>
int main(){

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

সি ++ ওয়ে

gets সি ++ 11 এ সরানো হয়েছে।

[প্রস্তাবিত]: আপনি ব্যবহার করতে পারেন getline (Cin, নাম) যা হয় 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নিরাপদে ব্যবহার করা অসম্ভব। এমনকি এটি সি 11 এ সম্পূর্ণ অপসারণ করা হয়েছে।
মাদুর

1

আমি বরং ইনপুট পেতে নিম্নলিখিত পদ্ধতিটি ব্যবহার করি:

#include <iostream>
#include <string>

using namespace std;

int main(void) {
    string name;

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

    return 0;
}

স্ট্রিংয়ের জন্য অ্যারের মোট দৈর্ঘ্য নির্ধারণের পরিবর্তে এটি ব্যবহার করা খুব সহজ which

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.