برچسب ها: ورودی قالببندیشده، خروجی قالببندیشده، printf، scanf، fgets، getch، رشته قالب، مشخصکننده قالب، پرچمها، کاراکترهای کنترلی.
خروجی فرمت شده
امروز دو مورد را بررسی خواهیم کرد توابع مهمورودی و خروجی فرمت شده ساختار و عملکرد این توابع را تنها پس از مطالعه کار با اشاره گرها و توابع با می توان به طور کامل درک کرد عدد متغیرمولفه های. اما اکنون باید از این توابع استفاده کنید، بنابراین باید برخی از نکات را نادیده بگیرید.
تابع خروجی قالب بندی شده printf رشته قالب و آرگومان هایی را که باید چاپ شوند بر اساس قالب آرگومان می گیرد و تعداد کاراکترهای چاپ شده را برمی گرداند. در صورت بروز خطا، برمی گردد معنی منفیو مقدار را روی ferror قرار می دهد. اگر چندین خطا رخ داده باشد، خطا EILSEQ است.
int printf(const char * فرمت، ...);
#عبارتند از
تابع از طریق رشته تکرار می شود و اولین رخداد % را با آرگومان اول، وقوع دوم % را با آرگومان دوم و غیره جایگزین می کند. در ادامه به سادگی به لیست پرچم ها و نمونه های استفاده نگاه خواهیم کرد.
نحو تعیین کننده فرمت عمومی
مشخص کننده %[flags][width][.precision][length]
مشخص کننده بیشترین است جزء مهم. نوع متغیر و نحوه خروجی آن را مشخص می کند.
مشخص کننده | چه خروجی میخواهیم داشته باشیم؟ | مثال |
---|---|---|
د یا من | عدد صحیح با ورود به سیستم اعشاری | 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 چاپ شده اند در این آدرس ذخیره می شود | |
% | دو درصد متوالی علامت درصد را نشان می دهند | % |
#عبارتند از
رشته قالب ممکن است شامل زیرمشخصات اختیاری زیر نیز باشد: flag، width، precision و modifier (به ترتیب).
.دقت | شرح |
---|---|
.عدد | برای مشخصکنندههای عدد صحیح (d، i، o، u، x، x)، دقت حداقل تعداد کاراکترهایی را که باید خروجی باشد، تعیین میکند. اگر مقدار کوتاهتر باشد، صفرها قبل از عدد چاپ می شوند. مقدار حتی اگر طولانی تر باشد کوتاه نمی شود. دقت 0 به این معنی است که برای مقدار 0 چیزی خروجی وجود ندارد. برای مشخصکنندههای ممیز شناور (a، A، e، E، f، F)، این تعداد ارقامی است که باید بعد از نقطه اعشار چاپ شوند (پیشفرض 6). برای g و G، این تعداد ارقام قابل توجهی است که باید خروجی شود. برای s - تعداد مشخص شده کاراکترها نمایش داده می شود. به طور پیش فرض، تمام کاراکترها تا صفر اول نمایش داده می شوند. اگر عدد موجود نباشد، دقت پیشفرض 0 است |
.* | دقت در رشته قالب مشخص نشده است، به طور جداگانه به عنوان آرگومان ارسال می شود که باید قبل از عدد خروجی باشد. |
#عبارتند از
تعیین کننده فرعی طول، طول نوع را تغییر می دهد. اگر طول با نوع مطابقت نداشته باشد، در صورت امکان به نوع مورد نیاز تبدیل می شود.
مشخص کننده ها | |||||||
---|---|---|---|---|---|---|---|
طول | د، من | 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 | دوبل بلند |
#عبارتند از
ورودی فرمت شده
بیایید با استفاده از تابع scanf به ورودی فرمت شده نگاه کنیم.
int scanf (const char*، ...)
تابع یک رشته فرمت ورودی (شبیه رشته فرمت printf است) و آدرس هایی را می پذیرد که داده های خوانده شده باید روی آنها نوشته شود. تعداد آرگومان هایی که با موفقیت مقداردهی اولیه شده اند را برمی گرداند.
فرمت مشخص کننده ورودی
%[*][width][length] واجد شرایط
مشخص کننده | شرح | شخصیت های منتخب |
---|---|---|
من، تو | کل | شماره دلخواهاعداد (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.
#عبارتند از
علاوه بر عملکردهای scanf و printf، تعدادی عملکرد وجود دارد که به شما امکان می دهد داده های ورودی را دریافت کنید.
int getch()- کاراکتر وارد شده را برمی گرداند، اما آن را به کنسول خروجی نمی دهد. #عبارتند ازchar * fgets (char * str، int num، FILE * stream)- این تابع به شما امکان می دهد یک رشته را با کاراکترهای فضای خالی بخوانید. علیرغم اینکه با فایل کار می کند، می توان از آن برای خواندن نیز استفاده کرد جریان استانداردورودی مزیت آن نسبت به gets این است که به شما امکان می دهد مشخص کنید حداکثر اندازهخط خوانده می شود و خط را با یک کاراکتر پایانی به پایان می رساند.
#عبارتند از
نیست مجموعه کامل توابع مختلفورودی و خروجی کاراکتر بسیاری از این توابع وجود دارد، اما بسیاری از آنها ناامن هستند، بنابراین قبل از استفاده از آنها، مستندات را به دقت بخوانید.
] SCANF #شامل
وقتی همه دادهها داده میشوند و نیازی به وارد کردن چیزی نیست، خیلی خوب است. اما، باور کنید، این عملا هرگز اتفاق نمی افتد. به یاد داشته باشید در مدرسه، زمانی که چیزهای خاصی را اندازه گرفتید و سپس مقادیر حاصل را در فرمول های لازم وارد کردید.
scanf
در زبان C علاوه بر تابع خروجی printf نیز وجود دارد عملکرد اسکنبرای ورودی اکنون عملکرد scanf را با جزئیات بیشتری بررسی خواهیم کرد:
int i;
scanf("%d"، &i);
به نظر می رسد بسیار شبیه به تابع printf است. همچنین موجود در نقل قول های دوگانه تعیین کننده فرمت، اما تفاوت دقیقاً در قسمت دوم تابع است. آیا متوجه علامت (&) شدید؟ پس این علامت به معنای گرفتن آدرس است. اکنون توضیح خواهم داد که چرا این مورد نیاز است.
مقدار وارد شده را نه در جای دیگری، بلکه دقیقاً در آدرسی که متغیر ما در آن قرار دارد، بنویسیم. آن ها بدون علامت (&)، مقدار وارد شده ما در تمام مکانها به جز جایی که نیاز داریم پایان مییابد. بنابراین، هر زمان که نیاز به وارد کردن مقادیر از صفحه کلید داشتید، قبل از متغیر با علامت آدرس (&) قرار دهید.
تعیین کننده های قالب
خب حالا بریم مشخص کننده های قالب:- %d - یک عدد صحیح را بخوانید
- %o - عدد اکتال را بخوانید
- %x - عدد هگزادسیمال را بخوانید
- %e(%f) - یک عدد واقعی را بخوانید
- %s - خواندن کاراکتر
- %s - خواندن خط
int i;
scanf("%d"، &i);
int i;
scanf("%o"، &i);
int i;
scanf("%x"، &i);
float t;
scanf("%f"، &t);
char ch;
scanf("%c"، &ch);
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 است. این نوع در هدر اعلام شده است
اصلاح کننده قالب 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 است.