4.1 הקדמה הרצאה
פריית libc היא הספרייה השימושית ביותר בכתיבת קוד C.
למעשה, gcc מוסיף אותה אוטומטית לכל פרויקט- בהרצאה זו נלמד על כל הפונקציות החשובות ביותר.
כל הפונקציות של libc נמצאות בmanual של לינוקס,
למעשה תוכלו להשתמש בman כדי לקרוא ספציפית על פונקציות בlibc באמצעות הדגל "3", אם תכתבו man 3 printf תקבלו את העמוד man של פונקציית printf.
פונקציות שימושיות¶
הפונקציה printf מדפיסה טקסט למסך. זו אחת הפונקציות המרכזיות ב־C להצגת מידע. היא מאפשרת להשתמש במחרוזות פורמט (format strings) כדי לשלב ערכים של משתנים בטקסט. המחרוזת יכולה לכלול תווי פורמט כמו %d למספרים שלמים, %f למספרים ממשיים, %s למחרוזות, %c לתווים ועוד.
int age = 25;
float height = 1.75;
char name[] = "דן";
printf("שלום %s! אתה בן %d וגובהך %.2f מטרים\n", name, age, height);
הפלט של הקוד הזה יהיה:
אפשר גם להדפיס חישובים ישירות:
הפונקציה scanf משמשת לקריאת קלט מהמשתמש לפי פורמט מוגדר. היא דורשת הפניה (&) (הכתובת שלהם) למשתנים שאליהם נכתב הקלט. התחביר שלה דומה ל־printf, אך היא משמשת לקריאה במקום הדפסה.
אם המשתמש יקליד:
אז:
-
המשתנה
ageיקבל את הערך 23 -
המשתנה
gradeיקבל את הערך 95.5 -
המחרוזת
nameתכיל את "רוני"
שימוש לא זהיר ב־scanf עלול לגרום לשגיאות – יש להיזהר במיוחד עם מחרוזות.
הפונקציה puts מדפיסה מחרוזת למסך ומוסיפה תו מעבר שורה (\n) בסוף. היא פשוטה ומהירה מ־printf כאשר לא נדרש שימוש format string.
הפלט:
אי אפשר להשתמש בה לצורך שילוב משתנים – רק מחרוזת אחת נתמכת בכל קריאה.
הפונקציה putchar מדפיסה תו בודד למסך. היא מקבלת תו מסוג char ומציגה אותו.
אפשר גם להשתמש בה בלולאה כדי להדפיס מחרוזת תו אחר תו:
הפונקציה getchar קוראת תו בודד מהקלט ומחזירה אותו. אפשר להשתמש בה למשל לקבלת תגובת משתמש בתו אחד.
הפונקציה strlen מחזירה את האורך של מחרוזת, כלומר מספר התווים עד תו הסיום '\0' (לא כולל אותו).
שימושים נפוצים:
-
לבדוק אם מחרוזת ריקה:
strlen(s) == 0 -
לבצע לולאות על מחרוזת באורך משתנה
שים לב: אם תעביר אליה מצביע לא מאותחל או NULL, זה יגרום לקריסה.
הפונקציה strcpy מעתיקה מחרוזת אחת אל תוך אחרת. יש לוודא שהמחרוזת היעד גדולה מספיק כדי להכיל את התוכן המועתק.
אחרי העתקה זו, dest תכיל את המחרוזת "שלום".
אם תנסה להעתיק לתוך מצביע לא מאותחל או מחרוזת קטנה מדי – תקבל שגיאת ריצה.
הפונקציה strcmp משווה בין שתי מחרוזות תו אחר תו. היא מחזירה:
-
0אם המחרוזות שוות לגמרי -
ערך שלילי אם המחרוזת הראשונה "קטנה" מהשנייה (לפי סדר ASCII)
-
ערך חיובי אם היא "גדולה" ממנה
strcmp("abc", "abc"); // מחזיר 0
strcmp("abc", "abd"); // מחזיר ערך שלילי
strcmp("abc", "abb"); // מחזיר ערך חיובי
השוואה בין מחרוזות ב־C לא מתבצעת עם ==, אלא עם strcmp. אם תשתמש ב־== בין שני מצביעים למחרוזות – אתה בודק האם הם מצביעים לאותו מקום בזיכרון, לא האם הם מכילים את אותו טקסט.
למעשה כל הפונקציות של מחרוזות, בניהם גם strcmp וstrcpy יש בעיה- על הבעיה נדבר בהמשך- אבל בקצרה, בגלל שאין פרמטר בפונקציה שמציין את אורך המחרוזת שאנחנו רוצים להשוות או להעתיק עלולה לקרות בעיה אבטחתית מאוד חמורה.
ולכן, אנחנו לא משתמשים בstrcmp, אלה בחלופה שלה "strncmp", שמאפשרת גם לציין עם פרמטר את גודל המחרוזת שאותה אנחנו רוצים להשוות.
אותו הדבר לגבי strcpy, השתמשו בstrncpy במקום.
עשו man strncpy כדי לקרוא על הפונקציה.
טיפ דיבוג¶
הכלי ltrace הוא כלי לינוקסי נחמד, שיודע לעזור לנו לדבג תוכנות שמשתמשות בlibc.
הכלי ltrace יכול להראות לנו בלייב את כל הקריאות לlibc שתוכנה מסוימת מבצעת ואת הפרמטרים שהתוכנה מעבירה.
בדרך כלל, כאשר נכתוב קוד כלשהו שמשתמש בLIBC- ונרצה לדבג אותו, נוכל להשתמש בltrace כדי לראות את הקריאות שהקוד שלנו ביצע לlibc ואיזה ערכים הוא העביר לפונקציות השונות.
בנוסף, הכלי הזה חזק מאוד כאשר נרצה לחקור תוכנה מסוימת שלא אנחנו כתבנו- נוכל להשתמש בltrace כדי לראות איזה קריאות לlibc התוכנה עושה וככה לגלות חלק מהדברים שהתוכנה עושה.