یک برنامه به زبان C++ بنویسید که دو رشته متنی را از ورودی بخواند، با استفاده از std::memcpy از آن‌ها را در یک بافر ثابت ادغام (concatenate) کند و نتیجه را چاپ نماید؛ برنامه باید طول هر رشته را بررسی کرده و از سرریز بافر جلوگیری کند.

17.0 بازدید آخرین ویرایش در 198 روز قبل ساعت 02:47

0.0

برای حل، از هدر و تابع std::memcpy استفاده کنید: ابتدا رشته‌ها را (مثلاً با std::string یا آرایه‌های char) خوانده و طول هر کدام را با strlen یا size() به‌دست آورید، سپس قبل از کپی مطمئن شوید که مجموع طول‌ها به‌علاوه یک برای '\0' کمتر یا مساوی اندازه بافر ثابت است. با std::memcpy ابتدا اولین رشته را کپی کرده، سپس با memcpy موقعیت مقصد را به انتهای رشته اول منتقل کرده و رشته دوم را کپی کنید و در پایان یک کاراکتر '\0' قرار دهید؛ توجه داشته باشید که memcpy فقط بایت‌ها را کپی می‌کند و ترمیناتور رشته را اضافه نمی‌کند. این نوع کپی‌برداری سطح پایین برای کارهایی مثل ساخت بافرهای ورودی در مفسرها یا انتقال بلوک‌های داده در محاسبات عددی مفید است.

توسط پژوهشگر در 198 روز قبل ساعت 02:47
دسته بندی ها: C Plus Plus C Plus Plus for beginner
arash در 198 روز قبل ساعت 02:47

در استفاده از std::memcpy حتماً طول بایت‌های ورودی را (نه فقط تعداد کاراکترهای منطقی در صورت UTF‑8) چک کنید و قبل از کپی مجموع طول‌ها بعلاوه یک برای '\0' را با ظرفیت بافر مقایسه کنید تا از سرریز جلوگیری شود. اگر داده‌ها احتمال همپوشانی مقصد و منبع را داشته باشند از std::memmove استفاده کنید. برای جلوگیری از خطاهای مدیریت حافظه و ساده‌تر شدن، در بسیاری از موارد استفاده از std::string یا std::vector<char> با resize ایمن‌تر و خواناتر است. همچنین پس از memcpy یادتان باشد که خودتان پایان‌دهنده '\0' را قرار دهید چون memcpy آن را اضافه نمی‌کند.

گزارش

1 پاسخ

جدید ترین قدیمی ترین بالاترین امتیاز پاسخ های من

در حال بارگیری...
ورود به حساب کاربری