تفاوت بین آرایه کاراکتر و یک رشته C چیست؟


پاسخ 1:

مجموعه ای از کاراکترها یک طول ممتد حافظه است که به صورت 8 بایت بایت مورد تجزیه و تحلیل قرار می گیرد. اندازه در زمان ایجاد ثابت است و تضمین می شود که در هر بایت یک کاراکتر ذخیره می شود.

در این حالت ، یک شخصیت هر رقم باینری 8 بیتی از 00000000 (0x00 hex) تا 11111111 (hex 0xFF) است.

کاراکتر [100]؛ / * آرایه 100 کاراکتر [0] برای آرایه [99] * /

رشته AC برای ذخیره سازی از یک آرایه کاراکتر استفاده می کند. یک رشته C می تواند از 0 تا طول شخصیت آرایه منهای 1 باشد.

برای شکل گیری ، آرایه فقط ممکن است شامل زیر مجموعه ای از بایت ها باشد که نمادهای معتبری را در کاراکتری که قرار است استفاده شود نشان می دهد. این اغلب ASCII یا UTF-8 است. هنگام چاپ رشته یا تفسیر ، همه بایت های دیگر ممکن است معتبر نباشند.

رشته دارای یک برچسب (متغیر) است که یک نوع نشانگر کاراکتر (char *) است که حاوی آدرس آرایه است.

رشته دارای NULCHAR ('0 0 ، 0x00 برابر) است که رشته را بعد از آخرین کاراکتر رشته به پایان می رساند.

char [10]؛ char * t =؟ strncpy (t ، "012345678 \ 0" ، 10)

"رشته فوری" با علامت نقل قول مضاعف در کد منبع نوشته می شود و باعث می شود یک آرایه کاراکتر با کاراکترهای پر شده ساخته شود و در یک مکان خاص فقط برای خواندن رشته ها ذخیره شود و یک نشانگر به آنها بازگردانده شود. این "شکر نحوی کامپایلر" است و استفاده از چنین رشته ها را ساده می کند. NULCHAR به طور خودکار به آرایه وصل می شود تا آن را به یک رشته خوش فرم تبدیل کند.

char * s = "یک رشته فوری"؛ printf ("٪ s \ n) ، ها)؛

تمام عملکردهای استاندارد رشته کتابخانه C رشته ها را به عنوان کاراکتر عبور داده و فرض می کنند "\ 0" وجود دارد.

"هک" که نسبتاً جهانی مورد استفاده قرار می گیرد این است که وقتی به یک آرایه دسترسی پیدا می کنید ، به عنوان نشانگر عنصر اول آرایه نیز عمل می کند. و برعکس

char * x = "abcdefgh"؛ printf ("شخصیت x 4:٪ c \ n" ، x [3])؛ x 4 کاراکتر: d / * رشته را درون یک آرایه کاراکتر * / کاراکتر [100] وارد کنید. strncpy (خیابان ، "abcdefghijklmnop \ 0" ، 18)؛ char * a = str؛ char * b = str + 7؛ printf ("٪ s \ n" ، الف)؛ abcdefghijklmnop printf ("٪ s \ n" ، b)؛ hijklmnop

با وجود این انعطاف پذیری ، یک رشته کاراکتر و یک رشته C به طور مستقیم سازگار نیستند.

char [10]؛ s = "abcdefghi"؛ / * خطا * / // خطا: انواع ناسازگار هنگام اختصاص به نوع "char [10]" از نوع "char *" "abcdefghi" رشته ای فوری است و به یک اشاره گر به "a" در آرایه ایجاد شده برای آن حل می شود. اختصاص دادن کار نمی کند زیرا نمی توان آرایه های مشخصی اختصاص داد.

آرایه ها واقعاً از نوع درجه یک در C نیستند. آنها را نمی توان به طور مستقیم کپی کرد ، آنها هیچگونه عملیات سطح آرایه ای ندارند و غیره. هر کاری که با آرایه های C انجام شود برای محتوای فردی انجام می شود ، نه به عنوان یک واحد.

char [10]؛ char * x = "abcdefghi"؛ / * '\ 0' در انتها * / strncpy (s ، x ، 10)؛ / * هر کاراکتر را در یک آرایه کپی می کند * /

پاسخ 2:

آرایه کاراکتری ساختار داده ای در زبان برنامه نویسی C است: تعدادی بایت در حافظه که در آن می توانید کاراکترها را ذخیره کنید. در هر یک از این سلول ها می توانید هر کاراکتری (به عنوان مثال بایت 8 بیتی ، مقدار 0 تا 255) را ذخیره کنید.

یک رشته به سبک C (همانطور که من "c-string" را در سوال شما تفسیر می کنم) یک راه برای نشان دادن یک "رشته" از کاراکترهایی است که زبان C به عنوان تعدادی از کاراکترها بدون بایت تهی (مقدار) تعریف می کند. 0) این توسط خود شخصیت ها نمایش داده می شود و به دنبال آن یک بایت صفر قرار می گیرد ، بنابراین طول رشته لازم نیست به طور جداگانه ذخیره شود. این مورد را با رشته سبک پاسکال مقایسه کنید ، که توسط یک عدد صحیح 16 بیتی بدون علامت نمایش داده می شود و به دنبال آن تعداد بایت اطلاعات (بنابراین رشته Pascal 65535 یا کمتر است) ارائه می شود.

آرایه کاراکتر یک ساختار داده است ، رشته C به سبک نمایش داده ها است. آنها حیوانات مختلفی هستند.

یک آرایه کاراکتر می تواند شامل یک رشته به سبک C یا چیز دیگری باشد (به عنوان مثال ، بعد از کاراکتر تهی شامل اطلاعات مفیدی است یا اصلاً حاوی هیچ شخصیت تهی نیست). و هنوز هم ، شما هنوز هم می توانید آن را به عنوان یک رشته به سبک C تفسیر کنید (مادامی که حداقل یک شخصیت خالی داشته باشد). یک رشته به سبک C را می توان در یک آرایه کاراکتر یا در مکانی غیر از یک آرایه ذخیره کرد (برای مثال ، بخشی از حافظه فقط خواندنی است و بنابراین نمی تواند مقادیر دیگر را "ذخیره کند").