PDA

View Full Version : سوال در مورد getchar()



redred
جمعه 25 اسفند 1391, 11:12 صبح
سلام
۳تا سوال در مورد کد زیر داشتم :



#include <stdio.h>
main (){
int ch;
do{
ch = getchar();
putchar(ch);
} while(ch != EOF);

}




۱. چرا ch از نوع int انتخاب شده ؟
۲. چه تایپ های دیگه ای میشه برای این متغییر انتخاب کرد ؟
۳. چه تعداد کارکتر میشه داخل این متغییر ذخیره کرد ؟؟ من هر تعدادی وارد کردم برنامه بدون مشکل کار کرد !!

rezaricky
جمعه 25 اسفند 1391, 18:17 عصر
1 - چون هر کاراکتر در واقع یک کد اسکی هست و کد اسکی هم عدد صحیح است
2- میشه char هم تعریف کرد
3- فقط یک کاراکتر ، این به خاطر حلقه while هست که تا هر وقت که کاراکتر انتهای رشته رو وارد نکنی از حلقه خارج نمیشه

redred
جمعه 25 اسفند 1391, 21:00 عصر
اینجور که من برداشت کردم این تابع یک کارکتر را میخونه و میریزه داخل متغییر. متغیر هم که از نوع int هست که میشه ۴b پس یک کارکتر توش جامیشه !! ولی من رشته هم با طول ۲۰-۳۰ کارکتر هم که تست کردم جواب داد !!

rezaricky
جمعه 25 اسفند 1391, 22:28 عصر
اگه بخوای 4 تا کاراکتر تو int ذخیره کنی باید تعیین کنی که کاراکتر اول از بیت 0 تا بیت 7 ام ذخیره بشه، کاراکتر دوم از بیت 8 تا بیت 15 ام و الی اخر.
بعد برای نمایش دادن اونها در صفحه هم باید دوباره مثل قبل بخونی و چاپش کنی
که این کار منطقی نیست و بجاش بهتره یک ارایه char تعریف کنی و یا از کلاس string استفاده کنی

redred
جمعه 25 اسفند 1391, 22:52 عصر
الان مشکلم اینجاست که هر ورودی که میزنم قبول میکنه . مگه این متغییر نباید فقط برای یک کارکتر فضا داشته باشه ؟؟؟؟
101501
http://barnamenevis.org/images/misc/pencil.png

smemamian
جمعه 25 اسفند 1391, 23:29 عصر
بی ربط به موضوع :

آقای redred از چه IDE استفاده می کنید ؟

maktoom
شنبه 26 اسفند 1391, 00:00 صبح
سلام
فقط خواستم اشاره ای داشته باشم که جناب redred در سومین پستشون توی این سایت نوع سیستم عامل و لپ تاپشون، اسم خودشون و اسم پروفایلشون رو نشون دادن. که ممکنه در جاهای دیگه اینجوری بی احتیاطی ها براشون گرون تموم بشه.
دوستانه عرض کردم.
موفق باشید./

redred
شنبه 26 اسفند 1391, 00:24 صبح
از sublime text (http://www.sublimetext.com/) استفاده میکنم. امکانات خیلی خوبی داره تغیریبا همه زبانها رو ساپورت میکنه . میشه گفت فوق العاده هست

در مورد اسم و سیستم عامل و .... :
اسم و فامیل من تو اینترنت زیاد هست !! (جز ساجست های گوگل هم هست!) این یوزری که اینجا دارم یوزر اصلیم نیست اسمو همینجوری گذاشتم :D مهم نیست کسی اسمم رو بدونه !! در مورد سیستم عامل و لپتاپ هم عرض کنم که این لپتاپ کلا برای تست دارمش زیاد مهم نیست کسی از سیستم عامل و مدلش با خبر باشه :D اگه کدی . کی لاگری چیزی خواستید تست کنید بدید روش امتحان کنم :)))))

ولی با این حال خیلی خیلی ممنون که تذکر دادید .

rezaricky
شنبه 26 اسفند 1391, 06:46 صبح
سوال اینه که چرا هر رشته ای رو وارد میکنی ، دوباره همونو چاپ میکنه؟
این به این خاطره که دفعه اول که ورودی رو وارد میکنی ترمینال (توی محیط لینوکس) ورودی رو نگه میداره و تو صفحه نشون میده .
با فشرده شدن دکمه enter ورودی رو وارد بافر استاندارد میکنه و حلقه شروع به اجرا میکنه ودوباره همون ورودی رو چاپ میکنه اما از حلقه خارج نمیشه .
همین روال ادامه داره تا کاربر ctrl + d رو تو محیط لینوکس و یا ctrl + z رو ویندوز بزنه و از حلقه خارج شه

دلیل اصلی اینم که چرا ch از نوع int تعریف شده اینه که بتونه مقدار EOF که -1 هست رو نگهداره ، چون اگه char بود نمیتونست مقدار منفی نگهداره


میشه برنامه رو طوری تغییر داد که تا وقتی که کاراکتر . وارد نشده برنامه اجرا بشه
#include <stdio.h>

int main ()
{
char c;
puts ("Enter text. Include a dot ('.') in a sentence to exit:");
do {
c=getchar();
putchar (c);
} while (c != '.');
return 0;
}

اینجا دیگه نیازی نیست که c از نوع int تعریف شود.

redred
شنبه 26 اسفند 1391, 20:00 عصر
ببینید این برنامه وقتی شروع میشه وارد حلقه میشه . بعد که کاربر کارکتر را وارد کرد اونو تو متغییر ch میریزه و بعد چاپش میکنه !
حالا مشکل من اینجاست چطوری توی این متغییر بیشتر از یک کارکتر جا میگیره ؟

rezaricky
یک شنبه 27 اسفند 1391, 09:29 صبح
یک بار گقتم یک بار دیگه هم میگم
وقتی داری رشته رو وارد میکنی تا کلید Enter رو نزدی خود ترمینال داره کاراکتر ها رو میگیره و نشون میده
وقتی دکمه enter رو میزنی ترمینال کاراکتر هایی رو که تا حالا وارد کردی وارد بافر میکنه و حلقه اجرا میشه و دستورات داخل حلقه اجرا میشن و رشته یکبار دیگه چاپ میشه
تا رشته ها تموم بشن . ولی چون ctrl+ d که همون EOF هست رو وارد نکردی از حلقه خارج نمیشه و دوباره ترمینال ازت رشته میگیره و وقتی دکمه enter رو زدی اونو وارد بافر میکنه و دوباره حلقه اجرا میشه.
این فرایند تا وقتی EOF وارد نشده ادامه داره