جستجو در تالارهای گفتگو
در حال نمایش نتایج برای برچسب های 'string'.
2 نتیجه پیدا شد
-
کامبیز اسدزاده یک موضوع را ارسال کرد در <span class="ipsBadge ipsBadge_pill" style="background-color: #e62f3d; color: #ffffff;" >برنامه نویسی در C و ++C</span>
با توجه به عنوان مقاله، شباهتهای بسیاری بین std::string_view و std::span وجود دارد، در واقع، string_view و span اشیاءای هستند که به یک ترتیبِ به هم پیوسته از عناصری اشاره دارند که نقطهٔ آغازین آنها از موقعیت صفر است؛ و همچنین عملیات استاندارد نگهدارندهها (ظرف) را ارائه میکنند. هر دو نوع شیء از نوع easy-to-copy (کپی آسان) هستند که دارای یک اشارهگر و یک عنصر اندازه هستند. از نظر مفهومی، آنها دیدگاههای غیر صاحب یک آرایه (یا دنبالهٔ پیوسته) هستند که رابط استاندارد غنیای را ارائه میکنند. در مورد تفاوتها (اختلافات) بین این دو، <std::span<T یک الگوی نمایش آرایهای با هدف کلی است، در حالی که std::string_view یک نمایش تخصصیتر در یک دنبالهکاراکتر یا رشته است. در زیر شرح مختصری از این تفاوتها آورده شده است: شیء span یک قالب (Template) است، اما string_view خیر! شیء span، الگویی است که با هر نوعِ تعریف شده توسط کاربر کار میکند، در حالی که string_view به طور خاص نمای یک آرایهٔ مشخص پیوسته است. از نظر سطحی یک string_view معادل <span <char است. char buff[] = "Hello World"; auto sp = std::span<char>(&buff[0], 5); auto sv = std::string_view(&buff[6], 5); for(auto c : sp) std::cout << c; //Hello std::cout << " "; for(auto c : sv) std::cout << c; //World اما، ویژگیهای string_view بیشتر از این مورد میتواند باشد. شیء string_view یک نوع فقط خواندنی برای نمایش است. یکی از ویژگیهای برجستهٔ string_view این است که این شیء فقط یک نمایش فقط خواندنی است. بنابراین، ما نمیتوانیم یک آرایهٔ زیرین را از طریق یک string_view تغییر دهیم، در حالی که این امکان از طریق span ممکن است: char str[] = "hello"; //Change str to uppercase through span auto sp = std::span<char>(str,strlen(str)); std::transform(sp.begin(), sp.end(), sp.begin(), [](char c) { return std::toupper(c); }); //str is now HELLO //Back to lowercase via string_view is not possible. auto sv = std::string_view(str); std::transform(sv.begin(), sv.end(), sv.begin(), [](char c) { return std::tolower(c); }); //ERROR! اگر string_view فقط خواندنی باشد، طول آن به اندازهٔ کافی انعطافپذیر است که از طریق <span <const T به یک نمایش فقط خواندنی تبدیل میشود. بنابراین یک string_view به یک <span <const char نزدیکتر است. البته یک ویژگی وجود دارد که string_view را تضمین میکند. شیء string_view از عملیات std::string-like پشتیبانی میکند. شیء span دارای چندین عملیات متوالی پیوسته است، به عنوان مثال: front, back, begin و operator[]. با این حال، string_view چندین روش دیگر مانند std::string دارد، به عنوان مثال: substr, find, compare سربارگذاری اپراتورها (مانند == و < یا >). بنابراین، string_view میتواند نیازِ به std::string را در مواردی که فضای زیرین آن مهم نیست را از بین ببرد.-
- span
- string_view
- (و 5 مورد دیگر)
-
درود بر دوستان عزیز؛ برای اضافه کردن یک کاراکتر به انتهای رشته شاید افراد به اینصورت عمل کنند : string[ strlen(string) ] = char; امّا من خواستم بدون وابسته بودن این قسمت به libc؛ این عمل انجام شود به اینصورت عمل کردم : int main (void){ /* Define variable */ char c = 'm'; char* string = NULL; /* Allocating memory */ string = malloc(7); /* Copy char into `string` */ strcpy(string, (char*)"ghase"); /* Append `c` to end of `string` */ *((char*)(&string + 1) - 2) = c; *((char*)(&string + 1) - 1) = '\0'; /* Result */ printf("%s\n", string); return EXIT_SUCCESS; } امّا با سیگنال SIGSEGV در تابع __strlen_sse2() هنگام فراخوانی printf() مواجه میشوم، کلاً حافظهٔ دریافتی از طریق Derefrence کردن string مقادیرش قابل دسترسی نیست (پیغامی که GDB نشان میدهد). ولی همچنان میتوانم بهاینصورت به مقداردهی که کردهام دسترسی داشتهباشم : printf("%c\n", *((char*)(&string + 1) - 2)); الآن چه اتفاقی برای حافظهٔ متغیر string میافتد ؟