מה ההבדל בין מערך תווים למחרוזת c?


תשובה 1:

מערך של char הוא טווח זיכרון רציף המנותח כ 8 בתים בתים. זה קבוע בגודל בעת היצירה, ומובטח לאחסן רישום בכל בייט.

מטען חובה במקרה זה הוא כל ספרה בינארית של 8 סיביות מ-00000000 (0x00 hex) ל- 11111111 (0xFF hex).

מערך char (100); / * 100 תווים מערך [0] למערך [99] * /

מחרוזת C משתמשת במערך char עבור אחסון. מחרוזת C יכולה להיות בין 0 לאורך המערך מינוס 1 תווים.

כדי להיות מעוצב היטב, המערך עשוי להכיל רק תת-קבוצה של בתים המייצגים סמלים תקפים בערכת התווים לשימוש. לעיתים קרובות זהו ASCII או UTF-8. כל בתים אחרים עשויים שלא להיות תקפים בעת הדפסה או פירוש של המחרוזת.

למחרוזת תהיה תווית (משתנה) שהיא סוג מצביע התו (char *) המכיל את כתובת המערך.

למחרוזת יהיה NULCHAR, ('\ 0', 0x00 hex) המסיים את המחרוזת, אחרי התו האחרון של המחרוזת.

char char [10]; char * t = & s; strncpy (t, "012345678 \ 0", 10)

'מחרוזת מיידית' נכתבת בציטוטים כפולים בקוד המקור וגורמת למערך תרשים עם הטבלאות שנמלאו ליצור ולמקם במיקום מחרוזת מיוחד לקריאה בלבד, ומצביע אליו מוחזר. זהו "סוכר תחביר" על ידי המהדר ומקל על השימוש במיתרים כאלה. NULCHAR מתווסף אוטומטית למערך כדי להפוך אותו למחרוזת מעוצבת היטב.

char * s = "מחרוזת מיידית"; printf ("% s \ n), s);

כל מחרוזות הספרייה הרגילה של ספריית C עוברות מחרוזות כתרשימים, וסומכות על כך שה' \ 0 'נמצא.

"גרזן" המשמש באופן אוניברסלי למדי הוא שהתווית של מערך כאשר ניגשים אליו משמשת כמצביע לאלמנט הראשון של המערך. ולהיפך.

char * x = "abcdefgh"; printf ("x תו 4:% c \ n", x [3]); x תו 4: ד / * הכניס מחרוזת למערך char * / char str [100]; strncpy (str, "abcdefghijklmnop \ 0", 18); char * a = str; char * b = str + 7; printf ("% s \ n", א); abcdefghijklmnop printf ("% s \ n", b); hijklmnop

על אף הגמישות הזו, מערך char ומחרוזת C אינם תואמים ישירות.

char char [10]; s = "abcdefghi"; / * שגיאה * / // שגיאה: סוגים שאינם תואמים בעת הקצאה להקליד 'char [10]' מהסוג 'char *' "abcdefghi" הוא מחרוזת מיידית ומחליטה למצביע ל- 'a' במערך שנוצר עבורו. הקצאת s זה לא עובדת, מכיוון שמערכי char אינם ניתנים להקצאה.

מערכים אינם באמת סוג מחלקה ראשונה ב- C. לא ניתן להעתיק אותם ישירות, אין להם פעולות ברמת מערך וכו '. כל מה שנעשה במערכים ב- C נעשה על התוכן האישי, לא כיחידה.

char char [10]; char * x = "abcdefghi"; / * '\ 0' הוא בסוף * / strncpy (s, x, 10); / * מעתיק כל רישום למערך * /

תשובה 2:

מערך תווים הוא מבנה נתונים בשפת התכנות C: מספר בתים בזיכרון בהם תוכלו לאחסן תווים. ניתן לאחסן כל תו (כלומר בתים של 8 סיביות, ערך 0 עד 255) בכל אחד מהתאים האלה.

מחרוזת בסגנון C (כמו מה שאני מפרש "מחרוזת c" בשאלתך ככוונה) היא דרך לייצג "מחרוזת" של תווים, המוגדרת על ידי שפת ה- C כמספר תווים ללא בייט null (ערך 0). זה מיוצג על ידי אותן הדמויות עצמן ואחריהן בייט null, כך שאין צורך לאחסן בנפרד את אורך המיתר. לעומת זאת עם המחרוזת בסגנון פסקל, שם היא מיוצגת על ידי מספר שלם שאינו חתום על 16 סיביות ואחריו מספר הבתים הזה (כך שאורך מחרוזת הפסקל הוא לכל היותר 65535).

אז מערך תווים הוא מבנה נתונים, מחרוזת בסגנון C היא ייצוג נתונים. הם בהמות שונות.

מערך תווים יכול להכיל מחרוזת בסגנון C, או שהוא עשוי להכיל משהו אחר (למשל, הוא מכיל מידע שימושי אחרי תו ה- null, או אינו מכיל תו null כלשהו); ואף על פי כן, בכל מקרה תוכל לפרש אותו כמחרוזת בסגנון C (כל עוד הוא מכיל לפחות תו null אחד). מחרוזת בסגנון C עשויה להיות מאוחסנת במערך תווים, או שהיא יכולה להיות מאוחסנת במקום כלשהו ולא במערך (למשל, חלק לקריאה בלבד בזיכרון ובכך לא יכולה "לאחסן" ערכים אחרים).