] 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 ارتباط نزدیکی با یکدیگر دارند عملیات مقایسه. برای شروع، ما عملیات مقایسه مختلفی را ارائه می دهیم:
اساساً، رایجترین اشتباهی که تازهکارها مرتکب میشوند، اشتباه گرفتن عملگر انتساب (=) با آن است عملیات مقایسه(==). اینها چیزهای کاملاً متفاوتی هستند. اما در اولین مراحل کدنویسی، همه دقیقاً بر همین اساس با خطا مواجه می شوند، پس بیشتر مراقب باشید.
توابع printf() و scanf() توانایی تعامل با برنامه را به ما می دهند. ما آنها را توابع ورودی/خروجی می نامیم. اینها تنها توابعی نیستند که میتوانیم برای ورودی و خروجی دادهها با استفاده از برنامههای C استفاده کنیم، اما همه کارهترین آنها هستند. این توابع در توضیحات زبان C و در کتابخانه stdio.h آورده شده است. به طور معمول، توابع printf() و scanf() تقریباً به یک روش کار می کنند - هر کدام از یک رشته کنترل و لیستی از آرگومان ها استفاده می کنند. ابتدا نحوه عملکرد تابع printf() و سپس scanf() را بررسی خواهیم کرد.
قالب |
نوع اطلاعات نمایش داده شده |
عدد صحیح اعشاری |
|
یک شخصیت |
|
رشته کاراکتر |
|
نماد نمایی |
|
عدد ممیز شناور، نماد دهی |
|
به جای %f یا %e استفاده می شود |
|
عدد صحیح اعشاری بدون علامت |
|
عدد صحیح هشتگانه بدون علامت |
|
عدد صحیح هگزادسیمال بدون علامت |
دستورالعملهایی که به تابع printf() ارسال میشوند زمانی که میخواهیم یک متغیر را چاپ کنیم به نوع متغیر بستگی دارد. به عنوان مثال، هنگام چاپ یک عدد صحیح، فرمت %d و هنگام چاپ یک کاراکتر، فرمت %c است. فرمت ها در جدول ذکر شده است.
بیایید ببینیم چگونه از این فرم ها استفاده می شود:
/* مهر */
#عبارتند از
#define PI 3.14159
int number = 2003;
printf("دانشگاه اینترنت فناوری اطلاعات در %d سال \n افتتاح شد"، شماره)؛
printf("مقدار pi %f است.\n"، PI);
فرمت مشخص شده هنگام فراخوانی تابع printf() به صورت زیر است:
printf(رشته کنترل، argument1، argument2،_);
آرگومان 1، آرگومان 2 و غیره پارامترهای قابل چاپی هستند که می توانند متغیر، ثابت یا حتی باشند اصطلاحات، قبل از چاپ محاسبه می شود.
خط کنترل رشته ای از کاراکترها است که نحوه چاپ پارامترها را نشان می دهد. به عنوان مثال، در اپراتور
printf("%d دانشآموز نمره %f دریافت کردند.\n"،
رشته کنترل عبارتی در گیومه است و عدد و z آرگومان یا در هستند در این موردمقادیر دو متغیر
می بینیم که خط کنترل شامل دو نوع مختلف اطلاعات است:
کاراکترهایی که به صورت متنی چاپ می شوند.
شناسه داده ها نیز نامیده می شود مشخصات تبدیل .
هر آرگومان از لیست زیر رشته کنترل باید با یک آرگومان مطابقت داشته باشد مشخصات تبدیل. اگر نیاز به چاپ عبارتی دارید، دیگر نیازی به استفاده نیست مشخصات تبدیل; اگر فقط نیاز به چاپ داده ها دارید، می توانید بدون استفاده از نظر این کار را انجام دهید. بنابراین هر یک از اپراتورهازیر کاملا قابل قبول هستند:
printf("این کتاب خیلی گران نیست!\n");
printf("%c%d\n","$",cost);
اگر نیاز به چاپ نماد % داشته باشید، کامپایلر آن را به عنوان یک خطا در نظر می گیرد مشخصات تبدیل. راه خروج از این وضعیت یک راه حل نسبتا ساده است - دو درصد کاراکتر را پشت سر هم بنویسید.
مثلا:
printf("فقط %d%% از جمعیت قادر به یادگیری مستقل هستند!\n",i);
نتیجه برنامه به شکل زیر خواهد بود:
فقط 5 درصد از جمعیت قادر به تحصیل مستقل هستند!
ما می توانیم تعریف اولیه را گسترش دهیم مشخصات تبدیل، قرار دادن اصلاح کننده ها بین علامت % و نمادی که نوع تبدیل را مشخص می کند. هنگام استفاده از چندین اصلاح کننده به طور همزمان، آنها باید به ترتیبی که در جدول ذکر شده اند مشخص شوند.
اصلاح کننده ها |
معنی |
آرگومان از موقعیت فیلد سمت چپ چاپ خواهد شد عرض داده شده. معمولاً چاپ آرگومان در سمت راست ترین موقعیت فیلد به پایان می رسد. مثال: %10 |
|
رشته اعداد |
حداقل عرض فیلد را تنظیم می کند. اگر عدد یا رشته ای که چاپ می شود در فیلد اصلی قرار نگیرد، از فیلد بزرگتر استفاده می شود. مثال: %4d |
رشته اعداد |
دقت را تعیین می کند: برای انواع داده های ممیز شناور، تعداد ارقامی که باید در سمت راست نقطه اعشار چاپ شوند. برای رشته های کاراکتر - حداکثر تعدادکاراکترهای قابل چاپ مثال: %4.2f (دو رقم اعشاری برای یک میدان چهار کاراکتری) |
عنصر داده مربوطه دارد نوع بلند, not int مثال: %ld |
printf("/%d/\n",135);
printf("/%2d/\n",135);
printf("/%10d/\n",135);
printf("/%-10d/\n",135);
اولین مشخصات تبدیل%d هیچ تغییر دهنده ای ندارد. این به اصطلاح انتخاب پیش فرض است، یعنی نتیجه عمل کامپایلر در صورتی که هیچ دستورالعمل اضافی به آن نداده باشید. دومین مشخصات تبدیل- %2d. مشخص می کند که عرض فیلد باید 2 باشد، اما از آنجایی که عدد از سه رقم تشکیل شده است، فیلد به طور خودکار به اندازه مورد نیاز گسترش می یابد. بعد مشخصات%10d نشان می دهد که عرض فیلد 10 است. آخرین مشخصات-10d همچنین عرض فیلد 10 را مشخص می کند و علامت - باعث می شود کل عدد به چپ منتقل شود.
تابع scanf() یک رویه ورودی است همه منظوره، که داده ها را از stdin می خواند. او می تواند داده های همه را بخواند انواع اساسیو به صورت خودکار آنها را به فرمت داخلی مورد نظر تبدیل کنید. اگر printf() ورودی را به جای خروجی انجام می داد، می توان آن را آنالوگ scanf() نامید.
رشته کنترلی که توسط فرمت به آن اشاره می شود از سه نوع کاراکتر تشکیل شده است:
- مشخص کننده های قالب
- نمادهای خاص
- شخصیت های دیگر (خاص نیست)
مشخصکنندههای قالب از نماد درصد پیروی میکنند و به scanf() میگویند که چه نوع دادهای در ادامه خوانده میشود. کدهای مشخص کننده در جدول آورده شده است.
کد | معنی |
---|---|
٪با | یک کاراکتر بشمار |
%d | |
٪من | شمردن عدد اعشارینوع کامل |
%e | |
% f | تعداد ممیز شناور را بشمارید |
% g | تعداد ممیز شناور را بشمارید |
%O | عدد اکتال را بشمار |
%s | خط شمارش |
٪ایکس | عدد هگزادسیمال را بشمارید |
%R | نشانگر شمارش |
%n | یک عدد صحیح برابر با تعداد کاراکترهای خوانده شده تا کنون می گیرد |
%u | یک عدد صحیح بدون علامت را می خواند |
% | مجموعه ای از شخصیت ها را مشاهده می کند |
%% | کاراکتر % را می خواند |
برای مثال %s یک رشته را می خواند و %d یک متغیر عدد صحیح را می خواند.
رشته قالب از چپ به راست خوانده می شود و کدهای قالب را با آرگومان های لیست آرگومان تطبیق می دهد.
کاراکترهای خاص در خط کنترل باعث میشوند که scanf() یک یا چند مورد را رد کند شخصیت های خاصدر جریان ورودی کاراکترهای ویژه عبارتند از space، tab یا newline. یک کاراکتر ویژه در خط کنترل باعث میشود که scanf() بدون ذخیره کردن، هر تعداد (شامل صفر) از نویسههای ویژه متوالی را از جریان ورودی بخواند تا زمانی که با کاراکتری که کاراکتر خاصی نیست مواجه شود.
دسترسی نماد منظمباعث می شود ()scanf کاراکتر مربوطه را بخواند و دور بریزد. به عنوان مثال، "%d,%d" باعث می شود ()scanf یک عدد صحیح را بخواند، کاما را بخواند و کنار بگذارد و سپس یک عدد صحیح دیگر را بخواند. اگر کاراکتر مشخص شده در جریان ورودی یافت نشد، scanf() متوقف می شود.
تمام متغیرهایی که برای دریافت مقادیر با استفاده از تابع scanf() استفاده میشوند باید با آدرسهایشان جستجو شوند. این بدان معنی است که همه آرگومان های تابع باید اشاره گر به متغیرها باشند. بنابراین، C توانایی ارسال با مرجع را ایجاد می کند و این به تابع اجازه می دهد تا محتوای آرگومان را تغییر دهد.
Scanf("%d"، &count);
رشتهها در آرایههای کاراکتری خوانده میشوند و نام آرایه، بدون اشارهگر، آدرس اولین عنصر آرایه است. بنابراین، برای خواندن یک رشته در آدرس آرایه کاراکتر، می توانید از دستور استفاده کنید
Scanf("%s"، آدرس);
در این حالت، آدرس نام از قبل یک اشاره گر است و به پیشوند & نیاز ندارد.
عناصر داده ورودی باید با فاصله، برگه یا خطوط جدید از هم جدا شوند.
علائم نگارشی مانند کاما، نقطه ویرگول و غیره جداکننده محسوب نمی شوند. این به این معنی است که برای اپراتور
Scanf("%d%d"، &r، &с);
دنباله 10 20 پذیرفته می شود، اما دنباله 10،20 پذیرفته نمی شود. مشخص کننده های قالب scanf() به ترتیب متغیرهای موجود در لیست آرگومان هستند که مقادیر متغیرهای دریافتی را به آنها اختصاص می دهند.
علامت * بعد از % و قبل از تعیینکننده قالب، دادههای نوع مشخص شده را میخواند، اما انتساب به آن را متوقف میکند. پس کد
Scanf("%d%*c%d"، &x، &y);
هنگامی که دنباله 10/20 را وارد می کنید، مقدار 10 را به متغیر x اختصاص می دهد، کاراکتر / را حذف می کند و مقدار 20 را به متغیر y اختصاص می دهد.
دستورات قالب بندی می توانند یک اصلاح کننده را مشخص کنند حداکثر عرضزمینه های. این یک عدد صحیح است که بین علامت % و مشخص کننده فرمت قرار می گیرد. تعداد کاراکترهای خوانده شده برای هر فیلد معین را محدود می کند. به عنوان مثال، اگر نیاز به خواندن بیش از 20 کاراکتر در آرایه آدرس ندارید، باید بنویسید
Scanf("%20s"، آدرس);
اگر جریان ورودی بیش از 20 کاراکتر داشته باشد، دفعه بعد که تابع ورودی فراخوانی می شود، ورودی را از جایی که ورودی در طول تماس فعلی متوقف شده است آغاز می کند. ورود به میدان ممکن است قبل از رسیدن قطع شود حداکثر طولفیلدها در صورت مواجه شدن با فاصله. در این حالت 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 کنار گذاشته می شود زیرا یک t در رشته کنترل وجود دارد.
یکی دیگر از ویژگی های تابع scanf() مجموعه اسکن نام دارد. مجموعه اسکن کاراکترهایی را تعریف می کند که توسط تابع scanf() خوانده شده و به عناصر آرایه کاراکتر مربوطه اختصاص داده می شود. برای تنظیم یک مجموعه اسکن، باید کاراکترهایی را که ورودی آنها قابل قبول است در براکت قرار دهید. قبل از اولین براکت مربعیک علامت درصد اضافه می شود. به عنوان مثال، لیست مجموعه اسکن زیر مشخص می کند که scanf() فقط کاراکترهای A، B و C را می خواند:
آرگومان مربوط به لیست مجموعه اسکن باید نشانگر یک آرایه کاراکتری باشد. هنگام استفاده از یک مجموعه اسکن، scanf() کاراکترها را می خواند و آنها را در آرایه مشخص شده قرار می دهد تا زمانی که با کاراکتری مواجه شود که در مجموعه اسکن نیست (یعنی فقط کاراکترهایی که در مجموعه اسکن هستند خوانده می شوند).
آرایه ای که توسط scanf() برگردانده می شود دارای یک رشته با پایان تهی خواهد بود. لیست کاراکترهای خوانده شده را می توان به صورت معکوس نیز مشخص کرد. برای انجام این کار، ^ را به عنوان اولین کاراکتر قرار دهید. سپس scanf() هر کاراکتری را که در مجموعه اسکن نباشد می پذیرد.
می توانید از علامت نقل قول برای تعیین محدوده کاراکترهایی که پذیرفته می شوند استفاده کنید. به عنوان مثال، عبارت زیر به scanf() دستور می دهد تا حروف "A" تا "Z" را بپذیرد:
چند اسکن بین حروف بزرگ و حروف کوچک. اگر می خواهید scanf() هر دو را بپذیرد، باید آنها را به طور جداگانه در مجموعه اسکن فهرست کنید.
تابع scanf() عددی برابر با تعداد فیلدهایی که مقادیر آنها در واقع به متغیرها اختصاص داده شده است را برمی گرداند. این شمارش شامل فیلدهایی نمی شود که خوانده شده اند اما مقادیر آنها به دلیل استفاده از اصلاح کننده * برای سرکوب تخصیص به چیزی اختصاص داده نشده است. اگر قبل از تخصیص اولین فیلد خطایی رخ داده باشد، EOF برگردانده می شود.
هنگام استفاده از Borland C++ در یک محیط 16 بیتی، میتوانید مدل حافظه پیشفرض مورد استفاده برای کامپایل یک برنامه را تغییر دهید. نشانه صریحاندازه هر اشاره گر استفاده شده در فراخوانی scanf(). اشاره گر نزدیک توسط اصلاح کننده N و نشانگر دور توسط اصلاح کننده F مشخص می شود. (اگر برنامه برای مدل حافظه عظیم کامپایل شده باشد، نمی توانید از اصلاح کننده N استفاده کنید.)
تابع scanf() یک تابع چند منظوره است که به شما امکان می دهد هر نوع داده ای را وارد رایانه خود کنید. نام تابع هدف آن را منعکس می کند - عملکرد صفحه کلید را اسکن می کند (مشاهده می کند)، تعیین می کند که کدام کلیدها فشار داده شوند و سپس ورودی را بر اساس کاراکترهای قالب بندی شده SCAN تفسیر می کند. دقیقاً مانند تابع printf()، scanf() میتواند چندین آرگومان بگیرد و به شما امکان میدهد مقادیر متغیرهای عددی، کاراکتر و رشتهای را همزمان وارد کنید.
درست مانند لیست پارامترهای printf()، لیست پارامترهای تابع scanf() از دو بخش تشکیل شده است: یک رشته قالب و یک لیست داده (شکل 5.7). خط فرمت حاوی نشانگرهای قالب است، در اینجا آنها نامیده می شوند مبدل های کاراکتر*، که تعیین می کند چگونه داده های ورودی باید تفسیر شوند. لیست داده ها شامل متغیرهایی است که مقادیر وارد شده باید در آنها وارد شود.
برنج. 5.7. لیست پارامترهای تابع scanf() به دو قسمت تقسیم می شود
اندیکاتورهای قالب مشابه آنهایی هستند که توسط تابع printf() استفاده می شود:
هنگام وارد کردن داده های عددی یا کاراکتری، باید آدرس متغیر را در لیست داده تابع scanf() و نه فقط نام آن را مشخص کنید:
scanf("%f"، &amount);
* که دراصلیکاراکترهای تبدیل(تقریباً ترجمه)
در این مثال، تابع scanf() یک عدد ممیز شناور می گیرد و آن را در ناحیه حافظه رزرو شده برای مقدار متغیر قرار می دهد. هنگامی که یک عدد در این ناحیه حافظه قرار می گیرد، به طور خودکار به مقدار متغیر تبدیل می شود.
در حالی که تابع scanf() در حال اجرا است، اجرای برنامه به حالت تعلیق در می آید و برنامه منتظر ورود داده می شود. ورودی با فشار دادن کلید به پایان می رسد وارد.
اصل کار با داده های تابع scanf() اساساً با کار توابع gets() و getchar() متفاوت است. برای اینکه بفهمید وقتی با استفاده از scanf() تایپ می کنید دقیقاً چه اتفاقی می افتد، باید به این تفاوت ها با جزئیات نگاه کنید.
جریان ورودی
وقتی داده ها با استفاده از تابع gets() وارد می شوند، تمام کاراکترهایی که قبل از فشار دادن روی صفحه کلید تایپ شده اند وارد، تبدیل به مقدار متغیر می شود. هنگامی که یک کاراکتر با استفاده از تابع getchar() وارد می شود، فشار دادن یک کلید به طور خودکار باعث می شود که کاراکتر مربوطه به یک متغیر اختصاص داده شود.
تابع scanf() متفاوت عمل می کند. ()scanf به جای صرفا گرفتن داده و اختصاص دادن آن به یک متغیر، ابتدا از نشانگرهای قالب برای تعیین نحوه برخورد با کاراکترهای ورودی استفاده می کند.
معمولاً گفته می شود که scanf() داده ها را از آن دریافت می کند جریان ورودی. یک جریان ورودی دنباله ای از نمادها است که از منبعی می آیند. در مورد تابع scanf() منبع صفحه کلید است. پس از فشار دادن کلید واردتمام دادههایی که تا این زمان وارد شدهاند به شکل مجموعهای از کاراکترهای بیمعنی، به همان ترتیبی که تایپ شدهاند، به تابع ()scanf ارسال میشوند. scanf() سپس تعیین می کند که کدام کاراکتر با نوع مشخص شده توسط فرمت مشخص کننده مطابقت دارد و کدام کاراکتر باید نادیده گرفته شود. اشاره گرهای قالب را مبدل کاراکتر می نامند زیرا کاراکترهای خام را از جریان ورودی می گیرند و به داده هایی از نوع خاصی تبدیل می کنند. شکل 5.8 این فرآیند را نشان می دهد.
تابع scanf() کاراکترهای غیر اطلاعاتی را نادیده می گیرد: فاصله ها، تب ها و خطوط جدید، مگر اینکه نوع داده فعلی char باشد. بیایید به برنامه نگاه کنیم:
puts("لطفا یک عدد وارد کنید:");
scanf("%d"، &count);
printf("عدد %d است"، count);
برنج. 5.8. تابع scanf() جریان ورودی را می خواند و تعیین می کند که چه داده هایی باید وارد شوند و چه داده هایی باید نادیده گرفته شوند.
قبل از وارد کردن یک عدد، می توانید فاصله را تا جایی که می خواهید فشار دهید - C فاصله ها را نادیده می گیرد و منتظر اولین کاراکتر مهم است. سپس C تلاش خواهد کرد تا کاراکترها را با توجه به فرمتهای موجود در رشته فرمت تابع scanf() تبدیل کند. اگر این کاراکترها با فرمت مطابقت داشته باشند (در این مورد اگر اعداد باشند) در متغیر وارد می شوند. اگر با کاراکتری مواجه شوید که در قالب مورد انتظار نباشد، یعنی عدد نباشد، ورود داده متوقف می شود. به عنوان مثال، اگر دنباله "123abc" را روی صفحه کلید تایپ کنید، عدد 123 در مثال ما به متغیر count اختصاص داده می شود و حروف "abc" نادیده گرفته می شوند، همانطور که در شکل 5.9 نشان داده شده است. یک فاصله ممکن است باعث توقف ورود داده شود. به عنوان مثال، اگر "123" را تایپ کنید، به متغیر مقدار 12 اختصاص داده می شود و عدد 3 نادیده گرفته می شود.
برنج. 5.9. تابع scanf() وقتی با اولین کاراکتر غیر عددی روبرو می شود، وارد کردن داده را متوقف می کند.
اولین کاراکتر مهم باید با فرمت مشخص شده در آرگومان تابع ()scanf مطابقت داشته باشد. بنابراین، اگر دنباله "ABC123" را تایپ کنید، برنامه کل دنباله را نادیده می گیرد و شما را در مورد مقدار متغیر در تاریکی رها می کند.
کدام کاراکترها را برنامه به عنوان "مناسب" در نظر می گیرد به شاخص های قالب بستگی دارد. اگر نشانگر %d باشد، فقط اعداد و علامت منهای «مناسب» هستند. اگر نشانگر %x را قرار دهید، کاراکترهای 0123456789ABCDE با قالب مطابقت دارند، زیرا همه آنها هنگام نوشتن اعداد در سیستم اعداد هگزادسیمال استفاده می شوند. اگر نشانگر %c موجود باشد، هر کاراکتری پذیرفته میشود، حتی فضاهای داخل جریان ورودی توسط تابع scanf() در این مورد نادیده گرفته نمیشوند. اگر دستورالعمل بنویسید:
scanf("%c"، &letter);
و کلید فاصله را در ابتدای دنباله فشار دهید شخصیت های مهم، scanf() متغیر را روی یک فاصله تنظیم می کند و کاراکترهای بعدی را نادیده می گیرد. بنابراین، هنگام برخورد با نوع char، نمی توانید فاصله ها را قبل از سایر کاراکترها قرار دهید.
هنگام وارد کردن یک رشته، تابع scanf() شروع به تخصیص یک مقدار در اولین کاراکتر معنی دار می کند، فضاهای اصلی را نادیده می گیرد و زمانی که با اولین فاصله بین کاراکترهای مهم مواجه می شود، تخصیص را متوقف می کند. نگاهی به برنامه بیندازید:
puts("لطفا نام خود را وارد کنید:");
scanf("%s", name);
لطفاً توجه داشته باشید که عملگر دریافت آدرس با نام متغیر رشته ای استفاده نمی شود. اگر "Nancy" را روی صفحه کلید خود تایپ کنید و Enter را فشار دهید، آن کاراکترها به متغیر نام اختصاص داده می شوند. حتی اگر «Nancy Chasin» را تایپ کنید، scanf() شروع به تخصیص کاراکترها در اولین کاراکتر معنی دار می کند و زمانی که با اولین فاصله مواجه می شود متوقف می شود، بنابراین مقدار متغیر همچنان فقط نام نانسی خواهد بود و برنامه بقیه را نادیده می گیرد. (شکل 5.10).
برنج. 5.10. تابع scanf() خواندن کاراکترهای یک رشته را در اولین فاصله متوقف می کند
به دلیل این ویژگی تابع scanf() برای وارد کردن رشته ها چندان راحت نیست. در این موارد بهتر است از تابع gets() استفاده کنید.