ورود

View Full Version : cin.get



hercules_3d
سه شنبه 12 اردیبهشت 1385, 15:01 عصر
با سلام
یه سوال در مورد کد مقابل داشتم
cin.get(s,10,'c')
cout<<s;
چرا بعد از وارد کردن 9 کاراکتر یا کاراکتر c خوندن کاراکتر ها رو تا زمانی که من کلید enterرو تزدم متوقف نمیکنه و s رو چاپ نمیکنه در واقع من میخواهم بعد از وارد کردن 9 کاراکتر کاراکتر c خوندن کاراکتر ها متوقف شه و بدون زدن کلید enter کاراکتر s رو چاپ کنه

Mahdi_Delphi
سه شنبه 12 اردیبهشت 1385, 19:13 عصر
در مورد مثال شما تابع cin.get تا زمانی که به کاراکتر 'c' برسد به خواندن رشته ادامه میدهد مگر اینکه تعداد کاراکترها به 9 برسد.
زدن اینتر به کار تابع پایان میده.
در ضمن شما میتوانید بیشتر از 9 کاراکتر وارد کنید اما فقط 9 کاراکتر اول آن (در صورتی که c وارد نشود) در رشته ذخیره میشود.
برای تحقق هدفتون شما باید از یک حلقه به همرا دستور getch یا getche استفاده کنید.
مهدی

hercules_3d
چهارشنبه 13 اردیبهشت 1385, 08:07 صبح
با تشکر از پاسخ شما و در ضمن یه چند تا سوال دیگه هم داشتم
1.اینکه تابع getline میتونه حائل رو از مجرای ورودی حذف کنه ولی تابع get نمیتونه یعنی چی؟
2.getline : removes delimiter from input stream
get : the delimiter is not extracted from input stream
میخواستم در مورد این دو جمله توضیح بدین (البته اولی مربوط به سوال اولم میشه) من که منظورش رو نمیفهمم :گریه: چون با توجه به کدهای مقابل خروجی هر دو یکی هستش! (با فرض اینکه چیزی که من برای s وارد میکنم somec هستش)
cin.get(s,10,'c');cout<<s;
cin.getline(s,10,'c');cout<<s;
خروجی هر دو some هستش
3. اینکه تابع getline کارکتر ها را درون بافر قرار میده یعنی چی ؟ در واقع منظور از بافر چیه؟ و این کار به چه دردی میخوره؟
getline : puts characters into buffer

Mahdi_Delphi
چهارشنبه 13 اردیبهشت 1385, 08:41 صبح
تابع get خودش 6 تا فرم مختلف داره اونها رو بررسی کنید به جواب میرسید.
منظور همون کاراکتر پارامتر سوم هست.
منظور از بافر هم همون رشته ای از حافظه است.همون * char

الان باید آماده بشم چون بعد از ظهر کلاس دارم وباید برم تحقیقم رو ارائه بدم.اگه مشکلت حل نشد بعدا با هم همفکری میکنیم.
موفق باشید

hercules_3d
چهارشنبه 13 اردیبهشت 1385, 09:07 صبح
جواب سوال سومم رو گرفتم ممنون ولی در مورد سوال اول و دومم میدونم منظور از حائل همون پارامتر سومه ولی اینکه تابع getline اونو از مجرای ورودی حذف میکنه و تابع get اونو از مجرای ورودی extracted نمیکنه رو نمیفهمم اصلا فرق اون دو تا کار بالایی چیه ؟! خروجی هر دو شون که یکیه!

hercules_3d
چهارشنبه 13 اردیبهشت 1385, 13:57 عصر
راستی یه اشکال دیگه در مورد کد زیر دارم !
1.cout << "Enter first string:" ;
2.cin.get(st1, 39) ;
3.cin.get(); /* for discard end of line char */
4. cout << "Enter second string:";
5. cin.get(st2, 39) ;
چرا اگه خط 3 رو بردارم cin.get(); /* for discard end of line char */ بعد از چاپ ابن پیغام :Enter second string نمیتونم رشته ی دومم رو وارد کنم یعنی انگار خط 5 کار نمیکنه cin.get(st2, 39) ;

hercules_3d
جمعه 15 اردیبهشت 1385, 08:20 صبح
دیگه کمک نمیکنین؟

Mahdi_Delphi
جمعه 15 اردیبهشت 1385, 09:27 صبح
دیگه کمک نمیکنین؟

تا جایی که بتونم کمک میکنم.


.اینکه تابع getline میتونه حائل رو از مجرای ورودی حذف کنه ولی تابع get نمیتونه یعنی چی؟
getline : removes delimiter from input stream
get : the delimiter is not extracted from input stream

بزارین یه نگاه به معنی این جملات انگلسیی بنداریم:
درتابع getline : فاصل یا حائل، از رشته ورودی حذف میشه.
در تابع get : فاصل یا حائل، از رشته ورودی استخراج (دریافت) نمیشود.

تفاوت این دوتا چیه ؟
(یه روح هستن در دو بدن)

پیاده سازی تابع get یه مقدار عجیبه.
ببینید یه بافر درونی برای تابع get در نظر بگیرید.یعنی جایی که کاراکترهایی رو که ار keyboard میخونه رو اونجا نگه میداره و بعد از اونجا میریزه توی متغیر رشته ای ما.
همه توابع get که توی برنامه مینویسید از همون یه بافر استفاده میکنن.
این کد رو اجرا کنین تا منظورم رو بهتر بفهمید:

وقتی برنامه درخواست وارد کردن رشته s1 رو کرد شما دقیقآ این رشته رو وارد کنید : salamqqsalam
نتیجه برنامه رو بررسی کنید به جواب سوالاتتون میرسید.


#include<iostream.h>
#include<conio.h>

int main()
{
char *s1="";
char *s2="";
clrscr();
cout<<"enter s1:";
cin.get(s1,10,'q');

cin.get();
cin.get();

cout<<"S1="<<s1<<endl;
cout<<"\nenter s2:";
cin.get(s2,6);
cout<<endl<<"S2="<<s2<<endl;

cout<<"\n\n\n ++++++++ END ++++++++";
getch();
return 0;
}


موفق باشید
مهدی

Mahdi_Delphi
جمعه 15 اردیبهشت 1385, 09:43 صبح
از اونجا که ممکنه با اجرای برنامه هم هنوز ابهاماتی داشته باشید یه تصویر براتون رسم کردم که مفهوم رو میرسونه :
:::::::::::::::::::::::::::::::::::::::::::::::::: :::::::::::::::::::

http://img.majidonline.com/pic/35642/get.JPG

:::::::::::::::::::::::::::::::::::::::::::::::::: :::::::::::::::::::
همونطور که میبینید تمام get ها از یه بافر یا حافظه مشترک استفاده میکنند که این بافر یه اشاره گر داره که مکانی که get فعلی باید ازش بخونه رو مشخص میکنه.

Mahdi_Delphi
جمعه 15 اردیبهشت 1385, 09:54 صبح
در مورد پست شماره 6 که از دوتا get استفاده کرده اید هم فکر کنم جوابتون رو گرفته باشید.
ولی اگه به جواب نرسیدید ،اگه به این نکته توجه کنید مطمئنا متوجه میشید:

پارامتر سوم تابع get به صورت پیش فرض 'n\' هست مگه اینکه شما کاراکتر دیگه ای رو براش در نظر بگیرید.یعنی کلید اینتر پایان رشته رو مشخص میکنه.
وقتی شما با get اول رشته ی اول رو میخونید و با زدن اینتر به خوند خاتمه میدید،کلید اینتر هم در بافر ذخیره میشه.کار تابع () cin.get در خط 3 هم اینه که اون کاراکتر اینتر رو رد کنه.
اگه از تابع () cin.get رو ننویسید تابع get ی که رشته دوم رو میخونه با رسیدن با کد اینتر فکر میکنه خوندن رشته به پایان رسیده و در نتیجه رشته دوم خالی میمونه.
-------------------
امیدوارم تونسته باشم کمک کنم دوست عزیز
مهدی

hercules_3d
جمعه 15 اردیبهشت 1385, 14:09 عصر
از کمکت خیلی ممنونم