PDA

View Full Version : سوال: cin.get()



helma20
چهارشنبه 27 آذر 1387, 21:16 عصر
سلام
کسی اطلاعات دقیقی از بافری که cin.ge استفاده می کنه داره؟

فرق cin.get با cin.getline چیه ؟

فرق endl و \n چیه؟
آیا endl بافر را خالی می کنه؟
:متفکر:

emad_67
چهارشنبه 27 آذر 1387, 23:40 عصر
cin.get چند تا overload داره، مثلا اگر اونو اینجوری بنویسی:


cin.get();
فقط یک کاراکتر رو از ورودی میخونه. یا اگر به این شکل بنویسی:


char s[10];
cin.get(s,10);
یک رشته رو از ورودی میخونه. در واقع این oveload از تابع get مثل getline عمل میکنه. توی getline هم به این شکل هست:


cin.getline(s,10);
اما تفاوتی که دارن اینه که cin.get فقط تا آخر رشته رو میخونه ولی cin.getline علاوه بر رشته enter آخر اونو هم میخونه، یعنی اگر فرضا شما بنویسی:


char s[10];
cin.get(s,10);
char ch=cin.get();
cout<<s<<(int)ch;
میبینی که برنامه صبر نمیکنه شما کاراکتری بعد از دریافت رشته، وارد کنید و در انتهای رشته چاپ شده عدد 10 هم چاپ میشه که کد اسکی enter هست. یعنی کاراکتر enter در بافر باقی مونده در حالی که در getline به این شکل نیست و بافر تخلیه میشه.

فرق endl و \n چیه؟
آیا endl بافر را خالی می کنه؟بله endl علاوه بر اوردن کرسر به سرخط بافر رو هم خالی میکنه در حالی که \n فقط میاره سر خط کرسر رو. در واقع endl به این شکل عمل میکنه:


cout<<"\n"<<flush;

deopen
پنج شنبه 28 آذر 1387, 14:23 عصر
بله, تابع cin.getline در واقع 3 آرگومان میگیرد :

1= رشته.(الزامی)
2= تعدادی که باید از رشته خوانده شود.(الزامی)
3=کارکتر تعیین مرز.(اختیاری,بطور پیشفرض 'n\')


char sen[60];
cin.getline(sen,60,'\n')

در کد بالا تابع عمل خواندن را تا هنگامی که با کارکتر مرز مواجه نشود یا تعداد کارکترها 59 یا کمتر از آن باشد ادامه میدهد, آخرین کارکتر , کارکتر null در نظر گرفته میشود, هنگام مواجه شدن با کارکتر مرز ('n\') تابع این کارکتر را میخواند ولی نابود میکند زیرا باید جایی برای کارکتر null بماند و همیشه هم کارکتر مرز کارکتر 'n\' نیست.

helma20
جمعه 29 آذر 1387, 13:02 عصر
اگر بخوام 2 تا رشته بگیرم وقتی با cin.get رشته اولی را می گیرم بعد ش باید با دستور cin.get() ا ، \n توی بافر را هم از بین ببرم یعنی بافر را خالی کنم و گرنه رشته دومی را نمی گیره

1- حالا چرا به جای استفاده کردن از cin.get() وقتی از endl استفاده می کنم بافرم خالی نمی شه endl هم بافر را خالی می کنه؟؟؟؟؟؟

2- من یه ارایه 2 بعدی را با cin.get گرفتم \n را هم از بین بردم اما نمی دونم چرا باید 10 بار اینتر بزنم تا خروجی را ببینم ؟ عجیبه؟ نمی دونم این \n ها از کجا می یاد؟

3- اصلا بافر چیه؟ چرا یه راست نمی ریزه تو رشته ؟

4- بافر تا کی باقی می مونه؟

emad_67
جمعه 29 آذر 1387, 13:33 عصر
1- حالا چرا به جای استفاده کردن از cin.get() وقتی از endl استفاده می کنم بافرم خالی نمی شه endl هم بافر را خالی می کنه؟؟؟؟؟؟
endl بافر جریان خروجی رو خالی میکنه. تو این مورد شما باید بافر ورودی رو خالی کنی. تو این مثال میتونی از cin.ignore() استفاده کنی.

من یه ارایه 2 بعدی را با cin.get گرفتم \n را هم از بین بردم اما نمی دونم چرا باید 10 بار اینتر بزنم تا خروجی را ببینم ؟ عجیبه؟ نمی دونم این \n ها از کجا می یاد؟

کدت رو بزار اینجا

3- اصلا بافر چیه؟ چرا یه راست نمی ریزه تو رشته ؟
توی این مثال بافر در واقع جایی هست که اطلاعات ورودی در صورتی که در رشته مورد نظر ذخیره نشن در اونجا میمونه. مثلا فرض کن شما مینویسی:


cin.get(s,5);

خوب تو اینجا فقط 5 تا کاراکتر از جریان ورودی خونده میشه و توی s قرار میگیره. حالا فرضا اگه کاربر بیاد 10 تا وارد کنه، 5 تا از اون خونده میشه و بقیش در جریان ورودی باقی میمونه.

4- بافر تا کی باقی می مونه؟
تا وقتی برنامت در حال اجراست.

helma20
یک شنبه 01 دی 1387, 12:03 عصر
این هم کد
نمی دونم چرا باید کلی اینتر بزنم تا خروجی را نشونم بده !!!!!!
ممنون می شم دلیلشو بگید






#include<iostream.h>
#include<string.h>
void main()
{
char ch[12][10];

cout<<"enter a string: ";
for (int i=0;ch[i-1][0] != '\n' ;i++)
{
cin.get(ch[i],6,' ');
cin.get();
}


cout<<'\t';
for (int k=0;k<(i-1);k++)
cout<<' '<<ch[k];
}

emad_67
دوشنبه 02 دی 1387, 00:16 صبح
اینی که نوشتی کلا غلطه، الان بار اول که کنترل برنامه بیاد تو حلقه for مقدار توی شرط حلقه میشه ch[-1][0] که اصلا وجود نداره. علت اینکه باید enter بزنی اینه که باید یه جایی شرط حلقه غلط بشه تا بیاد بیرون از حلقه دیگه.
الان میخوای دونه دونه کاراکتر ها رو بخونی و توی آرایه قرر بدی؟