4.2 - מחרוזות - הרצאה

הפונקציה strcat מחברת את המחרוזת השנייה לסוף הראשונה. יש לוודא שהמחרוזת הראשונה (dest) גדולה מספיק כדי להכיל את שתי המחרוזות יחד. תו הסיום '\0' מתעדכן אוטומטית.

char str1[100] = "hello ";
char str2[] = "world";
strcat(str1, str2);
// str1 now contains: "hello world"

איור המראה כיצד הפונקציה strcat מוצאת את תו הסיום של המחרוזת הראשונה, מעתיקה לשם את המחרוזת השנייה, וכותבת תו סיום חדש בסוף

שימוש לא זהיר עלול לגרום לחריגה מהזיכרון אם str1 לא מספיק גדולה.

הפונקציה strchr מחפשת תו בתוך מחרוזת, ומחזירה מצביע למיקום הראשון שבו התו מופיע. אם התו לא נמצא - מוחזר NULL.

char *text = "hello";
char *p = strchr(text, 'l');
// p will point to the first 'l', i.e. text + 2

איור המראה כיצד הפונקציה strchr בודקת תו אחרי תו במחרוזת עד שהיא מוצאת את התו המבוקש ומחזירה מצביע למקום שלו

אפשר גם לבדוק אם תו קיים:

if (strchr(text, 'x') == NULL) {
    printf("Character not found\n");
}

הפונקציה strstr מחפשת תת-מחרוזת בתוך מחרוזת אחרת, ומחזירה מצביע למיקום שבו היא מתחילה. אם לא נמצאה - מוחזר NULL.

char *text = "this is a test";
char *found = strstr(text, "is");
// found will point to "is a test"

שימושי מאוד לבדיקת תוכן או מימוש פונקציות חיפוש בסיסיות.

הפונקציה strncmp משווה בין שתי מחרוזות, אבל רק עד מספר תווים נתון. השוואה זו עוצרת לאחר n תווים או בסוף אחת המחרוזות, לפי המוקדם.

strncmp("abcd", "abcf", 3); // returns 0, because the first three characters are identical
strncmp("abcd", "abcf", 4); // returns negative, because 'd' < 'f'

מומלץ להשתמש ב-strncmp במקום strcmp כשלא בטוחים באורך המחרוזות או רוצים להשוות רק חלק.

הפונקציה memset ממלאת אזור בזיכרון בערך מסוים. שימוש נפוץ הוא לאיפוס מערכים או מבנים.

char buffer[100];
memset(buffer, 0, sizeof(buffer)); // sets all cells to zero

ניתן גם להשתמש למילוי בערכים אחרים:

memset(buffer, 'A', 10); // the first ten characters will be 'A'

הפונקציה פועלת ברמת הזיכרון, לא רק על מחרוזות.

הפונקציה memcpy מעתיקה תוכן מזיכרון אחד לאחר. ההעתקה מתבצעת בדיוק לפי מספר הבתים המבוקש. אין בדיקה אם האזורים חופפים - לכן לשימוש באזורים חופפים עדיף memmove.

char src[] = "hello";
char dest[100];
memcpy(dest, src, strlen(src) + 1); // including the terminating '\0'

שימוש נפוץ הוא העתקת מבנים, מערכים או חלקי זיכרון לא תלויים. חייבים לוודא שהיעד מספיק גדול להכיל את התוכן המועתק.