در تپش این هفته، ماجرای فریب و تعرض در پوشش عرفانهای دروغین و رمالی را بررسی کردیم
در زبانهای قدیمی مثل C متغیری برای تعریف یک عبارت متنی وجود ندارد، خب چه باید کرد؟
در زبان C دو نوع داده وجود دارد: دادههای عددی که خود شامل چند نوع هستند و دیگری کاراکتری. یک متغیر کاراکتری یک کاراکتر را در خود نگه میدارد مثلا ‘a’. خب حالا بر میگردیم به مقاله هفته پیش و تعریف آرایه. گفتیم آرایه به مجموعهای از دادهها اطلاق میشود که همگی از یک نوع باشند.
حال اگر ما یک آرایه از کاراکترها داشته باشیم، میتوانیم عبارتی مثل Click را در آن ذخیره کنیم چون در واقع Click یک آرایه است که از چند کاراکتر تشکیل شدهاست. طول این آرایه ? است.
خب پس ما میتوانیم بنویسیم:
Char stringvariable[5];
یا آن را مقداردهی اولیه کنیم:
Char srtringvariable[] = {‘C’,’l’,’i’,’c’,’k’};
به این نوع متغیر که آرایهای از کاراکترهاست و میتواند یک عبارت متنی را در خود ذخیره کند، در اصطلاح رشته (string)، میگویند. برخی از زبانهای جدید مثل C++ و جاوا خودشان یک نوع متغیر بهنام رشته (string) دارند. رشتهها را برخلاف بالا میتوان طور دیگری نیز مقداردهی اولیه کرد، بهصورت زیر:
Char stringvariable[] = “Click”;
برای دسترسی به کاراکترهای یک رشته دقیقا مثل یک آرایه عمل میکنیم، مثلا خروجی کد زیر برابر i است.
Printf(“%c”,stringvariable[2]);
حالا که با نحوه تعریف یک مقدار رشتهای آشنا شدیم باید بتوانیم مقدار این متغیر را از کاربر بگیریم. برای خواندن رشتهها روشهای مختلفی وجود دارد. روش اول استفاده از توابع تعریف شده در C برای خواندن عبارات رشتهای است.
Gets تابعی است که یک مقدار رشتهای را از کاربر میگیرد. تعریف تابع بهصورت زیر است:
Char* gets(char* buffer);
این تابع یک آرایه از رشتهکاراکترها را میگیرد و عبارتی که کاربر وارد کرده را از کیبورد میخواند و آن را در متغیر ورودی خود ذخیره میکند و همان مقدار را بهعنوان خروجی برمیگرداند. (توجه داشته باشید که char* در واقع همان آرایه است).
نکتهای که در استفاده از این تابع باید رعایت کنید، طول آرایه تعریف شده و طول عبارت وارد شده توسط کاربر است که در صورت بیشتر بودن مقدار وارد شده توسط کاربر برنامه شما با خطایBuffer Overflow روبهرو میشود (در مقالههای قبلی بهطور کامل در مورد این خطا بحث شده است).
برای جلوگیری از این کار باید به کاربر اطلاع دهید که نمیتواند تعداد کاراکترهایی بیشتر از مقدار مشخص شده توسط شما را وارد کند، اما وقتی کد خود را کامپایل میکنید کامپایلر به شما یک هشدار بهصورت زیر میدهد:
'gets': This function or variable may be unsafe. Consider using gets_s instead.
این هشدار به شما میگوید که تابع gets تابعی امن برای خواندن رشتهها نیست و بهتر است بهجای آن از gets_s استفاده کنید.
این تابع علاوه بر buffer یک عدد صحیح را از ورودی دریافت میکند که طول مجاز برای رشته دریافتی از سمت کاربر است. ضعف این دو تابع این است که کاراکترهای وارد شده را تا زمان رسیدن به یک Enter از کاربر میگیرد. یعنی کاربر نمیتواند یک متن چند خطی را در ورودی وارد کند.
برای رفع این مشکل از روش دیگری برای خواندن رشته از کاربر استفاده میکنیم. در این روش یک کاراکتر مشخص را نشانه انتهای رشته مورد نظر قرار میدهیم و از کاربر ورودی میگیریم تا زمانی که کاراکتر مورد نظر را وارد کند.
while ((temp[i]=getchar())!='*') i++;
temp[i] = '\0';
کاراکتر \0، این کاراکتر نشان دهنده پایان یک رشته است. از این کاراکتر میتوان برای چاپ رشته و محاسبه طول آن استفاده کرد.
این کد، ورودی را از کاربر میگیرد تا زمانی که کاربر کاراکتر * را وارد کند. مقدار i طول رشته خوانده شده است که با یک and منطقی ساده میتوان کد بالا را طوری بازنویسی کرد که کاربر از یک حدی بیشتر کاراکتر وارد نکند و مشکل Buffer overflow دیگر رخ ندهد.
اما نمایش رشتهها در خروجی: برای نشان دادن یک متغیر رشتهای میتوان از تابع puts استفاده کرد. این تابع یک متغیر رشتهای را از ورودی گرفته و آن را در خروجی چاپ میکند.
برای نمایش رشتهها در خروجی میتوان از تابع printf نیز بهصورت زیر استفاده کرد:
Printf(“%S”,text);
برای نمایش رشته نیز میتوان از حلقه زیر نیز استفاده کرد:
while(temp[i] != '\0')
putchar(temp[i++]);
امیربهاالدین سبط الشیخ
در تپش این هفته، ماجرای فریب و تعرض در پوشش عرفانهای دروغین و رمالی را بررسی کردیم
گزارش «جامجم» درباره دستاوردهای زبان فارسی در گفتوگو با برخی از چهرههای ادب معاصر
معاون وزیر بهداشت: