نحوه راه اندازی گوشی های هوشمند و رایانه های شخصی. پرتال اطلاعاتی

با scanf پررنگ است. عملکرد Scanf C: توضیحات

برچسب ها: ورودی قالب‌بندی‌شده، خروجی قالب‌بندی‌شده، printf، scanf، fgets، getch، رشته قالب، مشخص‌کننده قالب، پرچم‌ها، کاراکترهای کنترلی.

خروجی فرمت شده

امروز دو مورد را بررسی خواهیم کرد توابع مهمورودی و خروجی فرمت شده ساختار و عملکرد این توابع را تنها پس از مطالعه کار با اشاره گرها و توابع با می توان به طور کامل درک کرد عدد متغیرمولفه های. اما اکنون باید از این توابع استفاده کنید، بنابراین باید برخی از نکات را نادیده بگیرید.

تابع خروجی قالب بندی شده printf رشته قالب و آرگومان هایی را که باید چاپ شوند بر اساس قالب آرگومان می گیرد و تعداد کاراکترهای چاپ شده را برمی گرداند. در صورت بروز خطا، برمی گردد معنی منفیو مقدار را روی ferror قرار می دهد. اگر چندین خطا رخ داده باشد، خطا EILSEQ است.
int printf(const char * فرمت، ...);

#عبارتند از #عبارتند از void main() (// تابع هیچ آرگومان دیگری به جز رشته printf("Hello world"); getch(); ) دریافت نمی کند.

تابع از طریق رشته تکرار می شود و اولین رخداد % را با آرگومان اول، وقوع دوم % را با آرگومان دوم و غیره جایگزین می کند. در ادامه به سادگی به لیست پرچم ها و نمونه های استفاده نگاه خواهیم کرد.

نحو تعیین کننده فرمت عمومی
مشخص کننده %[flags][width][.precision][length]
مشخص کننده بیشترین است جزء مهم. نوع متغیر و نحوه خروجی آن را مشخص می کند.

Tab. 1 مشخص کننده نوع
مشخص کننده چه خروجی میخواهیم داشته باشیم؟ مثال
د یا من عدد صحیح با ورود به سیستم اعشاری 392
تو عدد صحیح بدون علامت در نماد اعشاری 7235
o بدون امضا به صورت هشتی 657
ایکس عدد صحیح بدون علامت در هگزادسیمال 7fa
ایکس عدد صحیح بدون علامت هگزا دسیمال، حروف بزرگ 7FA
f یا F عدد ممیز شناور 3.4563745
ه فرم علمی اعداد ممیز شناور 3.1234e+3
E فرم نمایی برای عدد ممیز شناور، حروف بزرگ 3.1234E+3
g کوتاه ترین نمایش فرمت های f و e 3.12
جی کوتاه ترین نمایش فرمت های F و E 3.12
آ نمایش هگزادسیمال یک عدد ممیز شناور -0xc.90fep-2
آ نمایش ممیز شناور هگزادسیمال، حروف بزرگ -0xc.90FEP-2
ج حرف آ
س رشته (آرایه تهی از حروف) سلام دنیا
پ نشانی اشاره گر b8000000
n هیچی چاپ نمیکنه آرگومان باید یک اشاره گر به یک int امضا شده باشد. تعداد حروفی که قبل از جلسه %n چاپ شده اند در این آدرس ذخیره می شود
% دو درصد متوالی علامت درصد را نشان می دهند %

#عبارتند از #عبارتند از void main() (int a = 0x77، b = -20؛ char c = "F"؛ float f = 12.2341524؛ double d = 2e8؛ char* string = "Hello, World!"; printf("%s\n "، رشته)؛ printf("a = %d، b = %d\n"، a، b)؛ printf("a = %u، b = %u\n، a، b)؛ printf(" a = %x، b = %X\n، a، b)؛ printf("dec a = %d, oct a = %o, hex a = %x\n"، a, a, a); printf ("نقطه شناور f = %f، exp f = %e\n"، f, f)؛ printf("double d = %f or %E\n", d, d)؛ printf("همه کامپایلرها پشتیبانی نمی‌شوند %a\n، f); printf("شخصیت c = %c، به عنوان عدد c = %d"، c، c)؛ printf("آدرس رشته %p است"، رشته)؛ getch(); )

رشته قالب ممکن است شامل زیرمشخصات اختیاری زیر نیز باشد: flag، width، precision و modifier (به ترتیب).

Tab. 4 دقت
.دقت شرح
.عدد برای مشخص‌کننده‌های عدد صحیح (d، i، o، u، x، x)، دقت حداقل تعداد کاراکترهایی را که باید خروجی باشد، تعیین می‌کند. اگر مقدار کوتاهتر باشد، صفرها قبل از عدد چاپ می شوند. مقدار حتی اگر طولانی تر باشد کوتاه نمی شود. دقت 0 به این معنی است که برای مقدار 0 چیزی خروجی وجود ندارد.
برای مشخص‌کننده‌های ممیز شناور (a، A، e، E، f، F)، این تعداد ارقامی است که باید بعد از نقطه اعشار چاپ شوند (پیش‌فرض 6).
برای g و G، این تعداد ارقام قابل توجهی است که باید خروجی شود.
برای s - تعداد مشخص شده کاراکترها نمایش داده می شود. به طور پیش فرض، تمام کاراکترها تا صفر اول نمایش داده می شوند.
اگر عدد موجود نباشد، دقت پیش‌فرض 0 است
.* دقت در رشته قالب مشخص نشده است، به طور جداگانه به عنوان آرگومان ارسال می شود که باید قبل از عدد خروجی باشد.

#عبارتند از #عبارتند از void main() (int a = 0x77, b = -20; char c = "F"؛ float f = 12.2341524; double d = 2e2; char* string = "Hello, World!"; printf("%.3f\ n"، f)؛ printf("%.*f\n"، 2، f)؛ printf("%010.3f\n"، d)؛ printf("%*d\n"، 6، a); printf("%+d\n"، b)؛ printf("%0.6d\n"، a); printf("%.f\n"، d); printf("%.4s"، رشته). getch();)

تعیین کننده فرعی طول، طول نوع را تغییر می دهد. اگر طول با نوع مطابقت نداشته باشد، در صورت امکان به نوع مورد نیاز تبدیل می شود.

Tab. 5 طول.
مشخص کننده ها
طول د، من u o x X f F e E g G a A ج س پ n
(هیچ یک) بین المللی بدون امضا دو برابر بین المللی کاراکتر* خالی* درون*
هه کاراکتر امضا شده کاراکتر بدون امضا کاراکتر امضا شده*
ساعت داخلی کوتاه بدون امضا کوتاه کوتاه داخلی*
ل طولانی بین المللی بدون امضا طولانی int wint_t wchar_t* طولانی مدت*
ll طولانی طولانی int بدون امضا طولانی طولانی بین طولانی مدت داخلی*
j intmax_t uintmax_t intmax_t*
z اندازه_t اندازه_t اندازه_t*
تی ptrdiff_t ptrdiff_t ptrdiff_t*
L دوبل بلند

#عبارتند از #عبارتند از void main() ( long long x = 12300000000579099123; short i = 10; printf("%llu\n", x); printf("%d\n", i); printf("%hd\n", i )؛ getch();)

ورودی فرمت شده

بیایید با استفاده از تابع scanf به ورودی فرمت شده نگاه کنیم.
int scanf (const char*، ...)
تابع یک رشته فرمت ورودی (شبیه رشته فرمت printf است) و آدرس هایی را می پذیرد که داده های خوانده شده باید روی آنها نوشته شود. تعداد آرگومان هایی که با موفقیت مقداردهی اولیه شده اند را برمی گرداند.
فرمت مشخص کننده ورودی
%[*][width][length] واجد شرایط

Tab. 6 مشخص کننده نوع
مشخص کننده شرح شخصیت های منتخب
من، تو کل شماره دلخواهاعداد (0-9) که احتمالاً با + یا - شروع می شوند. اگر عدد با 0 شروع شود، آنگاه به صورت هشتی، اگر با 0x شروع شود، سپس به صورت هگزا دسیمال خوانده می شود.
د عدد صحیح اعشاری هر تعداد رقم (0-9)، که احتمالاً با + یا - شروع می شود.
o عدد صحیح هشتگانه هر تعداد رقم (0-7)، که احتمالاً با + یا - شروع می شود.
ایکس عدد صحیح هگزادسیمال تعداد دلخواه ارقام (0-F)، که احتمالاً با + یا - شروع می شود و با 0x یا 0X پیشوند می شود.
f, e, g عدد ممیز شناور عددی متشکل از مجموعه ای از ارقام 0-9، احتمالاً با جداکننده اعشاری (نقطه). همچنین امکان نمایش آن به صورت نمایی نیز وجود دارد. C99 همچنین به شما امکان می دهد یک عدد را در قالب هگزادسیمال وارد کنید.
آ
ج سمبل اگر عرض عبور داده نشود، یک کاراکتر می خواند. اگر عرض عبور داده شود، تعداد مورد نیاز کاراکترها را می خواند و آنها را در آرایه بدون کاراکتر پایانه در انتها قرار می دهد.
س خط همه کاراکترهای بدون فضای سفید را می خواند. اگر عرض مشخص شده باشد، بیش از n کاراکتر نیست. جایگزین n+1 کاراکتر پایانه می شود.
پ نشانی اشاره گر دنباله ای از کاراکترها که به عنوان آدرس اشاره گر تفسیر می شوند. قالب به پیاده سازی وابسته است، اما همان چیزی است که printf با گزینه p خروجی می دهد
[شخصیت ها] بسیاری از نمادها فقط آن نویسه هایی را می خواند که در کروشه مربع، C99 نوشته شده اند
[^شخصیت ها] بسیاری از نمادها فقط نویسه هایی را می خواند که در کروشه های مربع مشخص نشده اند، C99
n چیزی نمیخواند تعداد کاراکترهای خوانده شده را در آدرس مشخص شده ذخیره می کند

همانطور که در printf، عرض مشخص شده توسط * یک آرگومان را انتظار دارد که عرض را مشخص کند. طول پرچم با این پرچم یکسان است توابع printf.

#عبارتند از #عبارتند از void main() ( سال، ماه، روز؛ بافر کاراکتر؛ تعداد int؛ //نیاز به ورودی فرمت شده، برای مثال 2013:12:12 printf("داده هایی مانند x:x:x =" را وارد کنید؛ scanf("% d:%d:%d، &year، &month، &day); printf("year = %d\nماه = %d، روز = %d\n"، سال، ماه، روز)؛ //خط را بخوانید، 127 کاراکتر بیشتر نیست. هنگام خواندن در یک آرایه، نیازی به نوشتن &، // ندارید، زیرا آرایه با یک اشاره گر جایگزین می شود printf("Enter string = "); scanf("%127s", buffer); printf( "%s"، بافر)؛ getch( ); )

علاوه بر عملکردهای scanf و printf، تعدادی عملکرد وجود دارد که به شما امکان می دهد داده های ورودی را دریافت کنید.

int getch()- کاراکتر وارد شده را برمی گرداند، اما آن را به کنسول خروجی نمی دهد. #عبارتند از #عبارتند از void main() (char c = 0; do (c = getch(); printf("%c"، c); ) while (c != "q"); )

char * fgets (char * str، int num، FILE * stream)- این تابع به شما امکان می دهد یک رشته را با کاراکترهای فضای خالی بخوانید. علیرغم اینکه با فایل کار می کند، می توان از آن برای خواندن نیز استفاده کرد جریان استانداردورودی مزیت آن نسبت به gets این است که به شما امکان می دهد مشخص کنید حداکثر اندازهخط خوانده می شود و خط را با یک کاراکتر پایانی به پایان می رساند.

#عبارتند از #عبارتند از #عبارتند از void main() ( char buffer; //خواندن از ورودی استاندارد fgets(buffer, 127, stdin); printf("%s", buffer); //این می تواند جایگزین انتظار برای ورود یک کاراکتر scanf("1" شود. ))

نیست مجموعه کامل توابع مختلفورودی و خروجی کاراکتر بسیاری از این توابع وجود دارد، اما بسیاری از آنها ناامن هستند، بنابراین قبل از استفاده از آنها، مستندات را به دقت بخوانید.

] SCANF #شامل int scanf(format-string[[, argument...]]); char *format-string. رشته کنترل فرمت شرح. تابع scanf داده ها را از stdin به مکان مشخص شده توسط آرگومان ها می خواند. هر آرگومان باید یک اشاره گر به یک مقدار با نوعی باشد که با نوع مشخص شده در رشته قالب مطابقت داشته باشد. رشته فرمت تبدیل فیلدهای ورودی را کنترل می کند. این رشته ممکن است شامل موارد زیر باشد: کاراکترهای "Whitespace", i.e. نویسه فاصله " "، تب \t، خط جدید "\n". برای تابع scanf، کاراکتر فاصله مشخص می‌کند که تمام کاراکترهای فضای بعدی وارد شده، تا اولین کاراکتر غیرفاصله، خوانده می‌شوند، اما ذخیره نمی‌شوند. همانطور که شما تایپ می کنید، یک کاراکتر فاصله در رشته قالب با هر عددی، از جمله 0، یا هر ترکیبی از کاراکترهای فاصله مطابقت دارد. هر کاراکتر کنترلی که علامت فاصله یا علامت درصد نیست. سپس با استفاده از این نماد، تابع scanf خوانده می شود، اما بدون ذخیره نمادهای کنترلی مربوطه. اگر شخصیت بعدی در با کاراکترهای کنترل مطابقت ندارد، scanf کار خود را خاتمه می دهد. مشخصات قالب، با علامت % وارد شده است. در این حالت scanf کاراکترهای وارد شده را می خواند و به مقادیر ورودی تبدیل می کند. از این نوع، و مقادیر توسط آرگومان های مربوطه از لیست آرگومان تعیین می شوند. رشته قالب از چپ به راست خوانده می شود. فرض بر این است که کاراکترهای خارج از مشخصات قالب با توالی کاراکترها در stdin مطابقت دارند. این کاراکترهای منطبق در stdin اسکن می شوند اما به خاطر نمی آیند. اگر یک کاراکتر در stdin با رشته قالب تضاد داشته باشد، scanf خاتمه می یابد. این کاراکتر متضاد در stdin باقی می ماند زیرا قابل خواندن نیست. وقتی با اولین مشخصات قالب مواجه شد، سپس مقدار اولین فیلد ورودی مطابق مشخصات قالب تبدیل شده و در مکانی که توسط آرگومان اول مشخص شده است ذخیره می شود. طبق مشخصات فرمت دوم، فیلد ورودی دوم توسط آرگومان دوم تبدیل و ذخیره می شود. و به همین ترتیب تا پایان خط فرمت. فیلد ورودی به اولین کاراکتر "فضای سفید" یا اولین نویسه ای که نمی تواند به فرمت مشخص شده تبدیل شود یا مورد رسیدن محدود است. عرض فیلدها، که اول می آید. اگر مشخصات قالب انتخابی آرگومان های بیشتری از حد مورد نیاز داشته باشد، آرگومان های اضافی نادیده گرفته می شوند. مشخصات فرمت دارای فرم زیر است. % <.precision><{F:N:h:I}>. هر فیلد در قالب مشخصات یک کاراکتر یا عدد جداگانه است که گزینه قالب متفاوتی را بیان می کند. کاراکتر نوع که بعد از آخرین مورد ظاهر می شود فیلد اختیاریقالب، نوع فیلد ورودی را به صورت کاراکتر، رشته یا عددی تعیین می کند. ساده ترین فرمت مشخصات فقط شامل کاراکتر علامت درصد و کاراکتر نوع (مثلا %S) است. هر فیلد مشخصات فرمت در زیر توضیح داده شده است. اگر پس از علامت درصد، کاراکتری که یک کاراکتر کنترل قالب نیست، دنبال شود، این کاراکتر و کاراکترهای پس از آن، تا علامت % بعدی، به‌عنوان یک دنباله منظم از کاراکترها در نظر گرفته می‌شوند، یعنی. دنباله ای که باید وارد شود به عنوان مثال، برای وارد کردن کاراکتر علامت %، از %% استفاده کنید. یک ستاره (*) به دنبال علامت %، تعیین فیلد ورودی بعدی را که به عنوان یک فیلد تعریف شده بر اساس نوع مشخص شده است، حذف می کند. این فیلد اسکن می شود اما به خاطر نمی ماند. Widht یک عدد صحیح اعشاری مثبت است و حداکثر تعداد ممکن از کاراکترهای خوانده شده از stdin را کنترل می کند. فقط آن دسته از کاراکترهایی که از عرض تجاوز نمی کنند توسط آرگومان مربوطه تبدیل و ذخیره می شوند. اگر عرض شامل کاراکترهای "فضای سفید" باشد، به عنوان مثال. فاصله ها، برگه ها یا خطوط جدید، تا زمانی که به عرض نرسیده باشند، به فرمت انتخاب شده تبدیل نمی شوند. پیشوندهای اختیاری F و N به قرارداد آدرس دهی پیش فرض مدل های حافظه استفاده شده احترام نمی گذارند. F می تواند پیشوندی برای آرگومان باشد که به یک شی دور اشاره می کند. و N - به جسم نزدیک. پیشوند اختیاری l نشان می دهد که نسخه طولانی در حال استفاده است. و پیشوند h استفاده از نسخه کوتاه را نشان می دهد. آرگومان مربوطه به یک شی بلند یا دوتایی (با استفاده از پیشوند l) یا یک شی کوتاه (با استفاده از پیشوند h) اشاره می کند. اصلاح کننده های l و h را می توان همراه با انواع کاراکترهای d، i، o، x، u استفاده کرد. اصلاح کننده l را می توان با کاراکترهای نوع e و f نیز استفاده کرد. اگر نوع دیگری مشخص شده باشد، اصلاح کننده های l و h نادیده گرفته می شوند. نمادهای نوع و معانی آنها در جدول R.4 توضیح داده شده است. جدول R.4 انواع کاراکتر scanf نماد نوع در نظر گرفته شده ورودی استدلال نوع d نشانگر عدد صحیح اعشاری به int. D نشانگر عدد صحیح اعشاری به long. o نشانگر عدد صحیح هشتگانه به int. O نشانگر عدد صحیح هشتی به long. x نشانگر هگزادسیمال به int. عدد صحیح X نشانگر هگزادسیمال به long. عدد صحیح i اعشاری، oc یک اشاره گر به int است. عدد صحیح مریک یا هگزا دسیمال I اعشاری، نشانگر هشتی به بلند. عدد صحیح متریک یا هگزادسیمال u نشانگر اعشاری بدون علامت به عدد صحیح اعشاری بدون علامت int. نشانگر اعشاری بدون علامت U به یک عدد صحیح بدون علامت طولانی. e نشانگر شناور به یک شناور f حاوی یک علامت اختیاری ("+"، "-")، یک یا چند رقم اعشاری، معمولا حاوی یک نقطه اعشار و یک توان ("e"، "E")، که پس از نوشته شده است. مقدار عدد صحیح امضا شده ج نمادین است. اشاره گر به نویسه ها: فاصله، برگه یا خط جدید، به اصطلاح کاراکترهای "فضای سفید" که معمولا نادیده گرفته می شوند، زمانی که این نوع مشخص شده باشد خوانده می شوند. برای خواندن نویسه بدون فضای سفید بعدی، از ترکیب %1s استفاده کنید. s رشته یک اشاره گر به یک آرایه نویسه به اندازه کافی بزرگ برای فیلد ورودی، با نویسه پایانی تهی "\0" به طور خودکار ظاهر می شود. n خواندن هنگام وارد کردن اشاره گر به int، در از جریان یا که بافر روی آن نوشته شده رخ نمی دهد، عدد با موفقیت خوانده می شود. کاراکترهای داده از جریان یا بافر، تا آنهایی که در تماس scanf مشخص شده است. مقدار p در نشانگر فرم به far- xxxx: yyyy، گروه داده کجاست. ارقام x و y ارقام هگزادسیمال بزرگ هستند. هنگام خواندن رشته هایی که با فضای خالی مشخص نشده اند، مجموعه کاراکترهای داخل کروشه باید با رشته نوع s جایگزین شود. فیلد ورودی مربوطه تا اولین کاراکتر که در مجموعه نویسه‌های محدود شده با کروشه مربع وجود ندارد خوانده می‌شود. اگر اولین کاراکتر در این مجموعه caret (^) باشد، نتیجه ذخیره می شود: فیلد ورودی تا اولین کاراکتر که در این مجموعه کاراکترها گنجانده نشده است خوانده می شود. برای به خاطر سپردن یک رشته بدون کاراکتر تهی "\0"، از مشخصات %nc استفاده می شود که n یک عدد صحیح اعشاری است. در این مورد، نوع کاراکتر s آرگومانی را تعریف می کند که به آرایه ای از کاراکترها اشاره می کند. n کاراکتر بعدی از جریان ورودی به یک مکان خاص خوانده می شود و کاراکتر null نوشته نمی شود. تابع scanf هر فیلد ورودی را کاراکتر به کاراکتر اسکن می کند. در صورت رسیدن به فیلد عرض، می‌تواند خواندن یک فیلد را با رسیدن به یک کاراکتر فاصله متوقف کند. یا کاراکتر ورودی بعدی را نمی توان با توجه به فرمت مشخص شده تبدیل کرد. یا کاراکتر بعدی با کاراکتر مربوطه در رشته کنترل قالب تضاد دارد. یا کاراکتر بعدی در مجموعه کاراکترهای انتخاب شده نیست. هنگامی که یک فرآیند پایان خواندن اجباری رخ می دهد، فیلد ورودی بعدی از همان اولین کاراکتر متضاد بررسی می شود. این کاراکتر، در صورت وجود، خوانده نشده، یا به عنوان اولین کاراکتر فیلد ورودی بعدی یا به عنوان اولین کاراکتر در خواندن های بعدی از stdin در نظر گرفته می شود. ارزش برگشتی این تابع تعداد فیلدهایی که با موفقیت تبدیل و تخصیص یافته اند را برمی گرداند. مقدار بازگشتی شامل تعداد فیلدهای خوانده شده اما تخصیص نیافته نیست. تلاش برای خواندن انتهای فایل EOF را برمی گرداند. مقدار بازگشتی 0 نشان می دهد که هیچ فیلدی اختصاص داده نشده است. fscanf، printf، sscanf، vfprintf، vprintf، vsprintf را نیز ببینید. مثال 1. #شامل int i; float fp; char c, s; scanf("%d %f %c %s"، &i، &fp، و c، s); /* ورودی داده های مختلف */. مثال 2. #شامل main () /* تبدیل عدد صحیح هگزا دسیمال ** یا اکتال به ** عدد صحیح اعشاری */ ( int numassigned, val; pintf("# هگزادسیمال یا اکتال را وارد کنید، یا 00 را به گیت:\n")؛ انجام دهید ( printf("# = "); numassigned = scanf("%i"، &val); printf("# اعشاری = %i\n"، nal); ) while (val && numassigned); /* انتهای حلقه اگر مقدار ورودی 00 باشد، یا اگر scanf قادر به اختصاص فیلد */ نباشد. سپس خروجی به صورت زیر خواهد بود. هگزادسیمال یا اکتال #، یا 00 را به گیت وارد کنید: # = 0xf اعشاری # = 15 # = 0100 اعشاری # = 64 # = 00 اعشاری # = 0.

وقتی همه داده‌ها داده می‌شوند و نیازی به وارد کردن چیزی نیست، خیلی خوب است. اما، باور کنید، این عملا هرگز اتفاق نمی افتد. به یاد داشته باشید در مدرسه، زمانی که چیزهای خاصی را اندازه گرفتید و سپس مقادیر حاصل را در فرمول های لازم وارد کردید.

scanf

در زبان C علاوه بر تابع خروجی printf نیز وجود دارد عملکرد اسکنبرای ورودی اکنون عملکرد scanf را با جزئیات بیشتری بررسی خواهیم کرد:

int i;
scanf("%d"، &i);

به نظر می رسد بسیار شبیه به تابع printf است. همچنین موجود در نقل قول های دوگانه تعیین کننده فرمت، اما تفاوت دقیقاً در قسمت دوم تابع است. آیا متوجه علامت (&) شدید؟ پس این علامت به معنای گرفتن آدرس است. اکنون توضیح خواهم داد که چرا این مورد نیاز است.

مقدار وارد شده را نه در جای دیگری، بلکه دقیقاً در آدرسی که متغیر ما در آن قرار دارد، بنویسیم. آن ها بدون علامت (&)، مقدار وارد شده ما در تمام مکان‌ها به جز جایی که نیاز داریم پایان می‌یابد. بنابراین، هر زمان که نیاز به وارد کردن مقادیر از صفحه کلید داشتید، قبل از متغیر با علامت آدرس (&) قرار دهید.

تعیین کننده های قالب

خب حالا بریم مشخص کننده های قالب:
  1. %d - یک عدد صحیح را بخوانید
  2. int i;
    scanf("%d"، &i);

  3. %o - عدد اکتال را بخوانید
  4. int i;
    scanf("%o"، &i);

  5. %x - عدد هگزادسیمال را بخوانید
  6. int i;
    scanf("%x"، &i);

  7. %e(%f) - یک عدد واقعی را بخوانید
  8. float t;
    scanf("%f"، &t);

  9. %s - خواندن کاراکتر
  10. char ch;
    scanf("%c"، &ch);

  11. %s - خواندن خط
  12. char *str;;
    scanf("%s", str);

    هنوز وارد کار با رشته ها نشوید. چرا علامت نشانی وجود ندارد؟ کمی بعد به این موضوع خواهیم پرداخت.

عملیات مقایسه

کامپیوتر در ابتدا مجهز به منطق بولی، یعنی همه چیز بر روی 0 و 1 ساخته شده است. اگر متوجه نمی شوید در مورد چه چیزی صحبت می کنیم، پس فیلم ماتریکس را تماشا کنید، جایی که هر محافظ صفحه نمایش سبز از این دو عدد جادویی تشکیل شده است.

البته 0 و 1 خوب هستند، اما ما به معنای منطقی نیاز داریم، بنابراین در عملیات منطقی 0 FALSE و 1 درست است. این مفاهیم TRUE و FALSE ارتباط نزدیکی با یکدیگر دارند عملیات مقایسه. برای شروع، ما عملیات مقایسه مختلفی را ارائه می دهیم:

اساساً، رایج‌ترین اشتباهی که تازه‌کارها مرتکب می‌شوند، اشتباه گرفتن عملگر انتساب (=) با آن است عملیات مقایسه(==). اینها چیزهای کاملاً متفاوتی هستند. اما در اولین مراحل کدنویسی، همه دقیقاً بر همین اساس با خطا مواجه می شوند، پس بیشتر مراقب باشید.

تابع scanf() یک رویه است همه منظوره، که جریان stdin را می خواند و اطلاعات را در متغیرهای مشخص شده توسط آرگومان های لیست شده در لیست آرگومان ذخیره می کند. این می تواند تمام انواع داده های داخلی را بخواند و به طور خودکار آنها را به فرمت داخلی مناسب تبدیل کند.

در نسخه C99، واجد شرایط محدود برای پارامتر فرمت اعمال شد.

رشته کنترل مشخص شده توسط پارامتر فرمت از کاراکترهای سه دسته تشکیل شده است:

  • مشخص کننده های قالب؛
  • کاراکترهای فضای خالی؛
  • کاراکترهای غیر از فضای خالی

مشخص‌کننده‌های قالب - قبل از علامت درصد (%) - نشان می‌دهند که چه نوع داده‌ای در مرحله بعد خوانده می‌شود. برای مثال، مشخص‌کننده %s یک رشته را می‌خواند و %d یک مقدار صحیح را می‌خواند. رشته قالب از چپ به راست خوانده می شود و مشخص کننده های قالب به ترتیب با آرگومان های فهرست شده در لیست آرگومان مطابقت داده می شوند. این کدها در جدول زیر نشان داده شده است.

کد هدف
٪آ یک مقدار ممیز شناور را می خواند (فقط C99)
٪آ مشابه کد %a (فقط C99)
٪با یک شخصیت را می خواند
%d یک عدد صحیح اعشاری را می خواند
٪من یک عدد صحیح را در هر قالبی می خواند (اعشاری، هشتی، هگزادسیمال)
%e یک عدد واقعی را می خواند
%E همانند کد %e
% f یک عدد واقعی را می خواند
%F مشابه کد %f (فقط C99)
% g یک عدد واقعی را می خواند
%G همان %g
%O یک عدد هشتی را می خواند
%s یک خط می خواند
٪ایکس عدد هگزادسیمال را می خواند
٪ایکس همانند کد %x
%R اشاره گر را می خواند
%n یک عدد صحیح برابر با تعداد کاراکترهای خوانده شده تا کنون می گیرد
%u یک عدد صحیح اعشاری بدون علامت را می خواند
% مجموعه ای از شخصیت ها را مشاهده می کند
%% علامت درصد را می خواند

به طور پیش‌فرض، مشخص‌کننده‌های a، f، e و g باعث می‌شوند که تابع scanf() داده‌ها را به متغیرها اختصاص دهد. نوع شناور. اگر یکی از این مشخص‌کننده‌های فرمت را با یک اصلاح‌کننده l پیشوند کنید، scanf() داده‌هایی را که می‌خواند به یک متغیر اختصاص می‌دهد. دوبل تایپ کنید. استفاده از اصلاح کننده L به این معنی است که متغیر دریافت کننده مقدار از نوع long double است.

اگر از یک کامپایلر مدرن استفاده می‌کنید که از ویژگی‌های کاراکتر دو بایتی اضافه شده در سال 1995 پشتیبانی می‌کند، می‌توانید از اصلاح‌کننده l در مشخص‌کننده c برای نشان‌دهنده اشاره‌گر به یک کاراکتر دو بایتی با نوع داده whcar_t استفاده کنید. اصلاح کننده l همچنین می تواند با کد فرمت s برای نشان دادن اشاره گر به رشته ای از کاراکترهای دو بایتی استفاده شود. علاوه بر این، اصلاح کننده l را می توان برای اصلاح مجموعه کاراکترهای دو بایتی در حال اسکن استفاده کرد.

کاراکترهای فضای خالی در رشته فرمت باعث می شوند که تابع scanf() از یک یا چند کاراکتر فضای خالی در جریان ورودی عبور کند. کاراکتر فضای خالی به معنای فاصله، تب یا کاراکتر خط جدید است. اساساً، یک کاراکتر فضای خالی منفرد در رشته کنترل باعث می‌شود که scanf() هر تعداد (حتی صفر) کاراکترهای فضای خالی را قبل از اولین کاراکتر غیرفضا بخواند، اما ذخیره نکند.

یک کاراکتر بدون فضای سفید در رشته فرمت باعث می شود ()scanf کاراکتر مربوطه را بخواند و کنار بگذارد. برای مثال، هنگام استفاده از رشته فرمت %d، %d، scanf() ابتدا مقدار صحیح را می‌خواند، سپس کاما را می‌خواند و دور می‌اندازد و در نهایت یک عدد صحیح دیگر را می‌خواند. اگر کاراکتر مشخص شده پیدا نشد scanf() خارج می شود.

تمام متغیرهایی که برای دریافت مقادیر با استفاده از تابع scanf() استفاده می‌شوند باید از آدرس‌هایشان عبور داده شوند. این بدان معناست که همه آرگومان ها باید نشانگر متغیرها باشند.

عناصر جریان ورودی باید با فاصله، برگه یا خطوط جدید از هم جدا شوند. نویسه هایی مانند کاما، نقطه ویرگول و غیره به عنوان جداکننده شناخته نمی شوند. این بدان معنی است که اپراتور

Scanf("%d%d"، &r، و c);

مقادیر وارد شده به عنوان 10 20 را می پذیرد، اما به طور قاطع از "ظرف" ارائه شده به عنوان 10.20 امتناع می کند.

کاراکتر * بعد از علامت % و قبل از کد قالب، داده ها را می خواند نوع داده شده، اما انتساب آنها را ممنوع خواهد کرد. بنابراین اپراتور

Scanf("%d%*c%d"، &x، &y);

وقتی به عنوان 10/20 وارد می شود، مقدار 10 را در متغیر x قرار می دهد، علامت تقسیم را کنار می گذارد و مقدار 20 را به متغیر y اختصاص می دهد.

دستورات قالب بندی ممکن است حاوی یک اصلاح کننده باشد حداکثر طولزمینه های. این یک عدد صحیح بین علامت % و یک کد قالب است که تعداد کاراکترهای خوانده شده را برای هر فیلد معین محدود می کند. به عنوان مثال، اگر می خواهید حداکثر 20 کاراکتر در متغیر آدرس بخوانید، از عبارت زیر استفاده کنید.

Scanf("%20s"، آدرس);

اگر جریان ورودی حاوی بیش از 20 کاراکتر باشد، دفعه بعد که به عملیات ورودی دسترسی پیدا کرد، خواندن از جایی که فراخوانی تابع scanf() قبلی "stop" شده بود آغاز می شود. وقتی پیدا شد کاراکتر فضای خالیورود داده برای یک فیلد ممکن است قبل از رسیدن به حداکثر طول فیلد کامل شود. در این حالت، تابع scanf() به خواندن فیلد بعدی می‌رود.

اگرچه از فاصله ها، تب ها و خطوط جدید به عنوان جداکننده فیلد استفاده می شود، اما هنگام خواندن یک کاراکتر، مانند هر کاراکتر دیگری خوانده می شوند. به عنوان مثال، اگر جریان ورودی از کاراکترهای x y تشکیل شده باشد، عملگر

Scanf("%c%c%c"، &a، &b، و c);

کاراکتر x را در متغیر a، فاصله را در متغیر b و کاراکتر y را در متغیر c قرار می دهد.

لطفا به یاد داشته باشید که هر شخصیت دیگر خط کنترل، مشخص‌کننده‌های بدون قالب (شامل فاصله‌ها، برگه‌ها و خطوط جدید) برای مطابقت و کنار گذاشتن کاراکترهای جریان ورودی استفاده می‌شوند. برای مثال، اگر جریان ورودی مانند 10t20 به نظر برسد، عبارت

Scanf("%st%s"، &x، &y);

10 را در متغیر x و 20 را در متغیر y قرار می دهد. کاراکتر t نادیده گرفته می شود زیرا در رشته کنترل وجود دارد.

روش دیگری برای استفاده از تابع scanf() scanset نام دارد. در این حالت مجموعه ای از کاراکترها تعریف می شود که می توان آنها را توسط تابع scanf() خواند و به آرایه کاراکتر مربوطه نسبت داد. برای تعریف چنین مجموعه ای، باید کاراکترهایی را که قرار است اسکن شوند، در پرانتز قرار دهید. افتتاح براکت مربعباید فوراً علامت درصد را دنبال کند. به عنوان مثال، مجموعه کاراکترهای اسکن شده زیر نشان می دهد که فقط کاراکترهای A، B و C باید خوانده شوند.

%[ABC]

هنگام استفاده از یک مجموعه کاراکتر برای اسکن، scanf() همچنان به خواندن کاراکترها و قرار دادن آنها در آرایه کاراکتر مناسب ادامه می دهد تا زمانی که با کاراکتری مواجه شود که در مجموعه کاراکترهای مشخص شده نیست. متغیر مجموعه مربوطه باید یک اشاره گر به یک آرایه کاراکتری باشد. هنگامی که scanf() برمی گردد، این آرایه حاوی یک رشته تهی از کاراکترهای خوانده شده خواهد بود.

اگر اولین کاراکتر در مجموعه یک caret (^) باشد، نتیجه عکس را دریافت می کنیم: فیلد ورودی تا اولین کاراکتر از مجموعه کاراکتر داده شده خوانده می شود، یعنی. caret باعث می‌شود که scanf() هر کاراکتری را که در مجموعه تعریف نشده است بپذیرد.

بسیاری از کامپایلرها به شما این امکان را می دهند که با استفاده از خط فاصله محدوده ای را مشخص کنید. به عنوان مثال، عبارت زیر باعث می شود که تابع scanf() کاراکترهای A تا Z را بپذیرد.

مهم است که به یاد داشته باشید که مجموعه کاراکتری که اسکن می شود بین حروف بزرگ و حروف کوچک. بنابراین، اگر می خواهید حروف بزرگ و کوچک را اسکن کنید، آنها را جداگانه تنظیم کنید.

تابع scanf() عددی برابر با تعداد فیلدهایی که با موفقیت مقادیر تخصیص داده شده اند را برمی گرداند. این فیلدها شامل فیلدهایی نمی شوند که خوانده شده اند اما به دلیل استفاده از اصلاح کننده * برای سرکوب تخصیص اختصاص داده نشده اند. اگر قبل از تنظیم فیلد اول خطایی تشخیص داده شود، scanf() EOF را برمی گرداند.

اصلاح کننده های فرمت توسط استاندارد C99 به scanf() اضافه شده است

C99 چندین اصلاح کننده فرمت را برای استفاده در تابع scanf() اضافه کرد: hh، ll، j، z و t. اصلاح‌کننده hh را می‌توان برای مشخص‌کننده‌های d، i، o، u، x و n اعمال کرد. به این معنی که آرگومان مربوطه یک اشاره‌گر به مقداری از نوع علامت char یا char بدون علامت است. اصلاح‌کننده ll را می‌توان برای مشخص‌کننده‌های d، i، o، u، x و n اعمال کرد. به این معنی که آرگومان مربوطه نشانگر مقداری از نوع علامت long long int یا بدون علامت long long int است.

اصلاح‌کننده فرمت j که برای مشخص‌کننده‌های d، i، o، u، x و n اعمال می‌شود، به این معنی است که آرگومان مربوطه یک اشاره‌گر به مقداری از نوع intmax_t یا uintmax_t است. این انواع در هدر اعلام شده است و برای ذخیره اعداد صحیح با حداکثر طول ممکن خدمت می کنند.

اصلاح‌کننده فرمت z که برای مشخص‌کننده‌های d، i، o، u، x و n اعمال می‌شود، به این معنی است که آرگومان مربوطه یک اشاره‌گر به یک شی از نوع size_t است. این نوع در هدر اعلام شده است و برای ذخیره نتیجه عملیات sizeof استفاده می شود.

اصلاح کننده قالب t که برای مشخص کننده های d، i، o، u، x و n اعمال می شود، به این معنی است که آرگومان مربوطه یک اشاره گر به یک شی از نوع ptrdiff_t است. این نوع در هدر اعلام شده است و برای ذخیره مقدار تفاوت بین دو اشاره گر عمل می کند.

تابع printf() به شما امکان می دهد هنگام برنامه نویسی در حالت کنسول، اطلاعات را روی صفحه نمایش دهید. این تابعدر کتابخانه stdio.h تعریف شده است و دارای نحو زیر است:

int printf(const char *format [, argument]...);

در اینجا، اولین آرگومان *format رشته‌ای را مشخص می‌کند که روی صفحه چاپ می‌شود و ممکن است شامل کاراکترهای کنترلی ویژه برای خروجی متغیرها باشد. پس از آن فهرستی از آرگومان های اختیاری ارائه می شود که در زیر توضیح داده شده است. این تابع یا تعداد کاراکترهای نمایش داده شده را برمی گرداند یا اگر به درستی کار نمی کند یک عدد منفی را برمی گرداند.

در ساده ترین پیاده سازی، تابع printf() به سادگی رشته داده شده را در صفحه نمایشگر چاپ می کند:

printf ("سلام دنیا.");

با این حال، می توان از آن برای نمایش متغیرها استفاده کرد انواع متفاوت: با عدد شروع می شود و با رشته ختم می شود. برای انجام این عمل از کاراکترهای کنترلی خاصی به نام specifier استفاده می شود که با کاراکتر % شروع می شود. مثال بعدیبا استفاده از تابع printf() خروجی متغیر عدد صحیح num را به صفحه نمایشگر نشان می دهد:

int num;
تعداد = 5;
printf("%d"، num);

دو خط اول این برنامه متغیری به نام num از نوع int را تنظیم می کند. خط سوم متغیر را روی صفحه چاپ می کند. تابع printf() به صورت زیر عمل می کند. ابتدا، تابع رشته ای را که باید نمایش داده شود، تجزیه می کند. که در در این مورداین "%d" است. اگر یک مشخص کننده در این خط یافت شود، آنگاه مقدار متغیر که آرگومان دوم تابع printf() است به جای آن نوشته می شود. در نتیجه، به جای رشته منبع"%d" خط "5" روی صفحه ظاهر می شود، یعنی. عدد 5 نمایش داده خواهد شد.

لازم به ذکر است که مشخص کننده "%d" فقط انواع متغیرهای عدد صحیح مانند int را خروجی می دهد. برای استنباط انواع دیگر، باید از مشخص کننده های مختلف استفاده کنید. انواع اصلی مشخص کننده ها در زیر ذکر شده است:

%с – تک کاراکتر
%d - عدد صحیح اعشاری امضا شده
%f - عدد ممیز شناور (نماد اعشاری)
%s – رشته کاراکتر (برای متغیرهای رشته)
%u – عدد صحیح اعشاری بدون علامت
%% - علامت درصد را چاپ کنید

با استفاده از تابع printf() می توانید چندین متغیر را همزمان چاپ کنید. برای این کار از ساختار زیر استفاده می شود:

int num_i;
float num_f;
num_i = 5;
num_f = 10.5;
printf("num_i = %d، num_f = %f"، num_i، num_f);

نتیجه اجرای برنامه به صورت زیر خواهد بود:

num_i = 5، num_f = 10.5

علاوه بر مشخص‌کننده‌ها، تابع printf() از کاراکترهای کنترلی مانند newline \n، tabs \t و غیره استفاده می‌کند. برای مثال، اگر در مثالی که قبلاً توضیح داده شد، لازم است مقادیر متغیرهای غیر در یک خط نمایش داده شوند. ، اما در یک ستون، سپس لازم است تابع printf() به روش زیر بازنویسی شود:

printf("num_i = %d،\n num_f = %f"، num_i، num_f);

کاراکتر تب نیز به همین صورت استفاده می شود.

برای وارد کردن اطلاعات از صفحه کلید، استفاده از تابع scanf() کتابخانه stdio.h راحت است که دستور زیر را دارد:

int scanf(const char *format [,argument]...);

در اینجا، مانند تابع printf()، متغیر *format تعریف می‌کند رشته فرمتبرای تعیین نوع داده های ورودی و می تواند حاوی همان مشخص کننده هایی باشد که تابع printf() است. سپس فهرستی از آرگومان های اختیاری می آید. عملکرد تابع scanf() در لیست 1.4 نشان داده شده است.

لیست 1.4. مثالی از استفاده از تابع scanf().

#عبارتند از
int main()
{
بین سن
وزن شناور
printf("اطلاعات سن خود را وارد کنید:");
scanf("%d"، &age);
printf("اطلاعات وزن خود را وارد کنید:");
scanf("%f"، &weight);
printf("سن شما = %d، وزن شما = %f"، سن، وزن)؛

بازگشت 0;
}

تفاوت اصلی بین استفاده از تابع scanf() و تابع printf() علامت & قبل از نام متغیری است که نتایج ورودی در آن نوشته می شود.

تابع scanf() می تواند با چندین متغیر همزمان کار کند. فرض کنید باید دو عدد صحیح را از صفحه کلید وارد کنید. به طور رسمی، برای انجام این کار می توانید تابع scanf() را دو بار فراخوانی کنید، اما بهتر است از این ساختار استفاده کنید:

scanf(" %d، %d "، &n، &m);

تابع scanf() این را طوری تفسیر می کند که انگار انتظار دارد کاربر یک عدد، سپس یک کاما و سپس یک عدد دوم وارد کند. همه چیز طوری کار می کند که انگار باید دو عدد صحیح را به صورت زیر وارد کنید:

تابع scanf() تعداد عناصری که با موفقیت خوانده شده را برمی گرداند. اگر عملیات خواندن اتفاق نیفتاد، چه اتفاقی می‌افتد که به جای آنچه مورد انتظار بود، چه اتفاقی می‌افتد ارزش دیجیتالاگر هر حرفی وارد شود، مقدار بازگشتی 0 است.

بهترین مقالات در این زمینه