حل مشکل کار با متون
قالب‌گیری دیجیتال
یکی از مسائلی که در مورد انواع رشته‌ها برای برنامه‌نویسان مطرح می‌شود، تراز كردن یا پوشانیدن متن (Text Wrapping) است. به‌عبارت دیگر هدف از پوشانیدن این است که تمام خطوط متن یکسان شوند، بهترین کار برای یک حل مساله این است که مستقیم به سراغ آن برویم. 

فرض کنید از کاربر یک عدد را به‌عنوان ورودی می‌گیریم و به‌دنبال آن یک متن را می‌گیریم و متن را به‌صورت خطوط هم اندازه‌ای که کاربر اندازه آن را وارد کرده است، تبدیل می‌کنیم، به این نکته توجه داریم که اگر کاربر در متن خود از کاراکتر \n یا همان کلید Enter استفاده کرد خط در همان جا به‌پایان می‌رسد و ما باید از خط بعد شروع کنیم.

به ادامه مطلب برو

فرض می‌کنیم که طول خط ورودی از سمت کاربر داخل متغیر length قرار گرفته باشد، ابتدا یک تابع به نام subStr معرفی می‌کنیم، شکل کلی این تابع به‌صورت زیر است:

int subStr(char dest[], char src[], int position);

این تابع متن src را بصورت بلاک‌هایی به اندازه length در dest قرار می‌دهد و اندیس آخرین عنصری که از src در dest قرار داده شده است را به‌علاوه 1 می‌کند و به عنوان خروجی برمی‌گرداند. این تابع به‌این نکته نیز توجه دارد که اگر در بلاک خوانده شده به کارکتر \n رسید مقدار خروجی خود را برابر اندیس \n بعلاوه 1 در متن src قرار دهد و به کار خود پایان دهد.

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

این تابع باید یک رشته از ورودی گرفته (text) و آن را به نسبت طول مورد نظر بپوشاند و در صفحه نمایش نشان بدهد. این تابع ابتدا توسط تابع subStr یک بلاک به اندازه length را از متن ورودی کاربر می‌خواند و مقدار خروجی تابع subStr را با طول متن ورودی چک می‌کند. اگر نتیجه بزرگتر بود به کار خود خاتمه می‌دهد، گفتیم تابع subStr یک مقدار عددی بر می‌گرداند که نشان دهنده این است که تا کجای متن اصلی را خوانده و در متغیر dest ریخته است، این مقدار را برابر begin قرار می‌دهیم. مقدار کاراکتر text در اندیس begin را با کاراکتر ‘ ‘ (فاصله) و \n مقایسه اگر هر کدام از اینها بود begin را یکی زیاد می‌کند که رشته بداند از کجا به بعد را باید بخواند و buffer را در متغییر محلی result که برای خروجی در نظر گرفتیم کپی می‌کند. اگر این مقایسه نتیجه منفی (false) داشت حال باید بررسی کنیم و ببینیم که آیا آخرین مقدار buffer باعث شکسته شدن متن شده است یا خیر. بطور مثلا ما متن “this is”  را به طول 6 واحد می خوانیم خوب مقدار biffer برابر “this I” می شود حال چون طول is کوچکتر از حد مجاز یعنی 6 است حق نداریم آنرا بشکنیم و باید is را با بلاک بعد محاسبه کنیم. یعنی مقدار مجاز برای buffer برابر "this" خواهد بود. بعد از همه اینها کار ما به پایان می‌رسد. ولی نتیجه چیزی نیست که می‌خواهیم. ما فقط متن را بصورت بلاک‌هایی به طول length تقسیم کردیم ولی ممکن است مقدار begin از 6 کمتر باشد آنوقت هیچ کدام از شرط‌های بالا رخ نخواهد داد در نتیجه آن بلاک آخر از دست می ‌رود. چاره چیست؟ ما این مشکل را این‌گونه حل می‌کنیم:

int index = 0;

for (index = begin; index « getLength(buffer) ; index++){

result[result_len + index] = buffer[index];}

result_len += index;

result_len++;

begin++;