מחרוזות קרן כליף.

Slides:



Advertisements
Similar presentations
מבוא למדעי המחשב לתעשייה וניהול
Advertisements

מבוא למדעי המחשב מערכים.
Pointers הרצאה קריטית. השאלות הפתוחות מה זה ה- & שמופיע ב scanf מדוע כשמעבירים מחרוזת ל scanf אין צורך ב & האם ניתן להכריז על מערך שגדלו אינו ידוע בתחילת.
מחרוזות נכתב ע " י כרמי גרושקו. כל הזכויות שמורות © 2010 הטכניון, מכון טכנולוגי לישראל 1.
תכנות תרגול 9 שבוע : הקשר בין מערכים למצביעים נרצה לעמוד על הקשר בין מערך למצביע מאחר ומערכים הם הכללה של משתנים הרי שברור שלמערך ולכל אחד מאיבריו.
תכנות תרגול 6 שבוע : חישוב e זוהי הנוסחא לחישוב e נראה כיצד לתרגם אותה לפונקציה n n.
תרגול 5 רקורסיות. רקורסיה קריאה של פונקציה לעצמה –באופן ישיר או באופן עקיף היתרון : תכנות של דברים מסובכים נעשה ברור ונוח יותר, מכיוון שזו למעשה צורת.
1 מבוא למדעי המחשב תרגול מספר 2. 2 בשיעור הקודם... הגדרות שפת מחשב, שפה עילית, קומפיילר, תוכנית בשפת C, קובץ הרצה קובץ (טקסט) המכיל תוכנית בשפת C (hello.c)
תכנות תרגול 4 שבוע : לולאות while לולאות while while (condition) { loop body } במקרה של קיום התנאי מתבצע גוף הלולאה ברגע שהתנאי לא מתקיים נצא.
מבוא לשפת C חידות ונקודות חשובות נכתב על-ידי יורי פקלני. © כל הזכויות שמורות לטכניון – מכון טכנולוגי לישראל.
11 Introduction to Programming in C תרגול
מבוא למדעי המחשב תרגול 8 - מחרוזות שעת קבלה : יום שני 11:00-12:00 דוא " ל :
מבוא כללי למדעי המחשב תרגול. הבית האדום כתובת : רחוב קוקוריקו 2 הבית הירוק כתובת : רחוב קוקוריקו 4 הבית הצהוב כתובת : רחוב קוקוריקו 1 הבית הורוד כתובת.
תכנות תרגול 9 שבוע : מערכים int a; a=5; int a[10]; a[2] = 5; 5 a a[0] a[1] a[2] a[9]  5 משתנה בודד מערך גישה למשתנה השלישי במערך.
11 Introduction to Programming in C - Fall 2010 – Erez Sharvit, Amir Menczel 1 Introduction to Programming in C תרגול
11 Introduction to Programming in C תרגול
תכנות תרגול 6 שבוע : תרגיל שורש של מספר מחושב לפי הסדרה הבאה : root 0 = 1 root n = root n-1 + a / root n-1 2 כאשר האיבר ה n של הסדרה הוא קירוב.
מבוא למדעי המחשב מחרוזות, מצביעים וכתובות
11 Introduction to Programming in C - Fall 2010 – Erez Sharvit, Amir Menczel 1 Introduction to Programming in C תרגול
תכנות תרגול 6 שבוע : הגדרת פונקציות return-value-type function-name(parameter1, parameter2, …) הגדרת סוג הערכים שהפונקציה מחזירה שם הפונקציהרשימת.
#include void main() { int i; char c; char st1[]="abcd"; for (i=-128;i
תכנות תרגול 10 שבוע : הקשר בין מערכים למצביעים נרצה לעמוד על הקשר בין מערך למצביע מאחר ומערכים הם הכללה של משתנים הרי שברור שלמערך ולכל אחד מאיבריו.
1 Introduction to Programming in C - Fall 2010 – Erez Sharvit, Amir Menczel 1 Introduction to Programming in C תרגול
מבוא כללי למדעי המחשב תרגול 3. לולאות while לולאות while while (condition) { loop body } במקרה של קיום התנאי מתבצע גוף הלולאה ברגע שהתנאי לא מתקיים נצא.
מבוא למדעי המחשב תרגול 6 - מערכים שעת קבלה : יום שני 11:00-12:00 דוא " ל :
תכנות תרגול 5 שבוע : הגדרת פונקציות return-value-type function-name(parameter1, parameter2, …) הגדרת סוג הערכים שהפונקציה מחזירה שם הפונקציהרשימת.
מערכים עד היום כדי לייצג 20 סטודנטים נאלצנו להגדיר עד היום כדי לייצג 20 סטודנטים נאלצנו להגדיר int grade1, grade2, …, grade20; int grade1, grade2, …, grade20;
מבוא למדעי המחשב תרגול 3 שעת קבלה : יום שני 11:00-12:00 דוא " ל :
תוכנה 1 - תרגול שיעור 10 Pointers (2) שולי לב יהודי
1 מבוא למדעי המחשב סיבוכיות. 2 סיבוכיות - מוטיבציה סידרת פיבונאצ'י: long fibonacci (int n) { if (n == 1 || n == 2) return 1; else return (fibonacci(n-1)
11 Introduction to Programming in C - Fall 2010 – Erez Sharvit, Amir Menczel 1 Introduction to Programming in C תרגול
Sscanf example #include int main () { char sentence []="Rudolph is 12 years old"; char str [20]; int i; sscanf (sentence,"%s %*s %d",str,&i); printf ("%s.
תכנות תרגול 8 שבוע : מערכים עד היום התוכניות שלנו לא ידעו לשמור כמות גדולה של מידע ללא הגדרת כמות גדולה של משתנים. עד היום התוכניות שלנו לא.
11 Introduction to Programming in C תרגול
מבנה נתונים ואלגוריתמים ) לשעבר - עיבוד מידע( ד"ר אבי רוזנפלד ד"ר אריאלה ריכרדסון.
תכנות מכוון עצמים ושפת ++C וויסאם חלילי. TODAY TOPICS: 1. Function Overloading & Default Parameters 2. Arguments By Reference 3. Multiple #include’s 4.
מבוא למדעי המחשב לתעשייה וניהול הרצאה 12. ספריות.
מבנים קרן כליף. ביחידה זו נלמד :  מהו מבנה (struct)  איתחול מבנה  השמת מבנים  השוואת מבנים  העברת מבנה לפונקציה  מבנה בתוך מבנה  מערך של מבנים.
Programming Pointers. נדגים היום בעזרת מצביעים העברת משתנים לפונקציה שמשנה אותם  פונקציה שמקבלת מצביעים לסמן תא בזיכרון  פונקציה שמחזירה מצביע מערך.
מחרוזות – הטיפוס String
מספרים אקראיים ניתן לייצר מספרים אקראיים ע"י הפונקציה int rand(void);
Programming Arrays.
מבוא למדעי המחשב לתעשייה וניהול
Lecture 8 String 1. Concept of strings String and pointers
הרצאה 10 פונקציות עם מספר משתנה של פרמטרים
מבוא למדעי המחשב סיבוכיות.
הקצאות דינאמיות בשילוב מבנים
מ- JAVA ל- C קרן כליף.
מיונים וחיפושים קרן כליף.
מחרוזות קרן כליף.
שיעור חמישי: מערכים ומחרוזות
מצביעים קרן כליף.
מערכים קרן כליף.
הקצאות דינאמיות קרן כליף.
מבנים קרן כליף.
פונקציות קרן כליף.
כתובות ומערכים אריתמטיקה של כתובות
שיעור שישי: מחרוזות, מצביעים
מצביעים קרן כליף.
ניתוח זמן ריצה (על קצה המזלג)
מ- C++ ל- C קרן כליף.
מבוא כללי למדעי המחשב תרגול 4
מבוא כללי למדעי המחשב תרגול 6
סוגי משתנים קרן כליף.
תיכון אהל שם, רמת גן קורס PHP – הרצאה מס' 10
מחרוזות קרן כליף.
Programming in C תרגול Introduction to C - Fall Amir Menczel.
תכנות מכוון עצמים ו- C++ יחידה 02 העמסת פונקציות, ערכי ברירת מחדל, enum, קימפול מותנה קרן כליף.
תירגול 8:מצביעים והקצאה דינאמית
Engineering Programming A
Presentation transcript:

מחרוזות קרן כליף

ביחידה זו נלמד: הפקודות: מהי מחרוזת איתחול מחרוזת gets, puts getchar, putchar, getch, getche מהי מחרוזת איתחול מחרוזת gets, puts הספריה string.h: strlen, strcpy, strcmp, strcat מערך של מחרוזות הפונקציות: sprintf, sscanf strchr, strstr, strtok static storage

הפקודות getchar ו- putchar #include <stdio.h> void main() { char ch; printf("Please enter a char: "); ch = getchar(); printf("The char is: ‘"); putchar(ch); printf(“’\n"); } scanf(“%c”, &ch); printf("The char is: ‘%c’\n“, ch);

הפקודות getch ו- getche שתי פקודות אלו קוראות נתון מהמקלדת ומיד מחזירות את השליטה לתוכנית, כלומר: לא אוגרות נתון בתוך ה- buffer / לא מחכות ל- ENTER ההבדל בינהן: getch לא מציגה את התו המוקלד למסך getche כן מציגה את התו המוקלד למסך כדי להשתמש בהן יש לבצע: #include <conio.h>

הפקודות getch ו- getche - דוגמא #include <stdio.h> #include <conio.h> void main() { char ch; printf("Please enter a char: "); ch = getche(); printf("\nThe printed char is %c\n", ch); ch = getch(); רואים את התו שהוקלד על המסך. מיד לאחר ההקלדה השליטה חזרה לתוכנית. לא רואים את התו שהוקלד על המסך. מיד לאחר ההקלדה השליטה חזרה לתוכנית.

מהי מחרוזת מחרוזת הינה טיפוס שנועד לאחסן מילים שלמות מחרוזת היא מקרה פרטי של מערך מטיפוס char אבל התו האחרון במחרוזת תמיד יהיה ‘\0’ (קוד ה- ASCII שלו הוא 0) לכן מחרוזת גם נקראית Null Termianted String מערך של תווים: char name[5] = {‘h’, ‘e’, ‘l’, ‘l’, ‘o’}; מחרוזת: char name[6] = {‘h’, ‘e’, ‘l’, ‘l’, ‘o’, ‘\0’}; העובדה שמחרוזת נגמרת ב- ‘\0’ מאפשרת לנו לרוץ עליה מבלי לדעת את גודלה

איתחול מחרוזת ראינו כי אתחול מחרוזת יעשה כך: char str[] = {'h','e','l','l','o','\0'}; אך ניתן לאתחלה גם באופן הבא: char str[] = “hello”; char str[30] = “hello”; void main() { int x = 4; } במקרה זה מוקצה מערך בגודל 30, ורק ב- 5 התאים הראשונים יש תווים, ובשאר 0, כמו איתחול חלקי של מערך char[]: str ‘h’ 1000 ‘e’ 1001 ‘l’ 1002 1003 ‘o’ 1004 ‘\0’ 1005 int: x 4 1006

ריצה על מחרוזת #include <stdio.h> void main() { char str[] = “hello”; int i=0; while (str[i] != '\0') printf("%c", str[i]); // same as: putchar(str[i]); i++; } printf("\n");

הדפסת מחרוזת מחרוזת היא אמנם מערך, אבל כדי להדפיס את איבריה אין צורך בלולאה! #include <stdio.h> void main() { char str[] = “hello”; printf(“%s\n”, str); }

הדפסת מחרוזת – נשים לב להבדל #include <stdio.h> void main() { char str1[] = {'h','e','l','l','o'}; // doesn’t end with ‘\0’!! char str2[] = "hello"; char str3[] = {'h','e','l','\0','l','o'}; // note the ‘\0’ in the middle char str4[] = {'h','e','l',0,'l','o'}; // note the 0 in the middle printf("%s\n", str1); printf("%s\n", str2); printf("%s\n", str3); printf("%s\n", str4); } כאשר מדפיסים מחרוזת ומשתמשים ב- %s יודפסו איברי המערך עד אשר הקומפיילר יתקל בתא שיש בו את הערך 0 (כלומר ערך ה- ASCII של ‘\0’), ולכן החשיבות של השמת ‘\0’ בסוף המחרוזת!

קליטת מחרוזת גם כדי לקלוט מחרוזת לא צריך לולאה: void main() { char str[10]; printf("Please enter a string: "); scanf("%s", str); // no need &!! printf("The string is: %s\n", str); } כאשר הפקודה scanf מקבלת %s היא יודעת לקרוא מחרוזת (אוסף תווים עד אשר יוקלד רווח מטיפוס כלשהו שיסמל את ה- ‘\0’) נשים לב שאורך המחרוזת שנכניס לא יהייה יותר גדול מגודל המערך שהגדרנו, כדי לא לדרוס תאים שלא הוקצו עבורו

הפקודות gets ו- puts עד כה ראינו כיצד ניתן לקרוא מילה שלמה (ללא רווחים), לשמור אותה במערך ולהדפיסה כעת נראה כיצד ניתן לבצע פעולות אלו גם עבור משפט (מחרוזת הכוללת רווחים) void main() { char str[50]; printf("Please enter a sentence: "); gets(str); printf("The sentence is: "); puts(str); } קולטת משפט עד ירידת שורה ('\n'), ולא רק עד רווח מדפיסה מחרוזת למסך + ירידת שורה בסוף

דוגמא: כמה מילים יש במשפט (הנחה: רווח אחד בלבד מפריד בין מילה למילה ויש לפחות מילה אחת במשפט) void main() { char str[50]; int numOfWords=0, i=0; printf("Please enter a sentence: "); gets(str); while (str[i] != '\0') if (str[i] == ‘ ‘) numOfWords++; i++; } printf("There are %d words in the sentence: ", numOfWords); puts(str);

דוגמא: כמה מילים יש במשפט (הנחה: רווח אחד בלבד מפריד בין מילה למילה ויש לפחות מילה אחת במשפט) void main() { char str[50]; int numOfWords=0, i=0; printf("Please enter a sentence: "); gets(str); while (str[i] != '\0') if (str[i++] == ' ') numOfWords++; } printf("There are %d words in the sentence: ", numOfWords); puts(str); תזכורת שאפשר גם כך:

דוגמא: כמה מילים יש במשפט (בלי הנחות, כל מקרי הקצה מטופלים ) #include <stdio.h> void main() } char str[50]; int numOfWords=0, i=0; printf("Please enter a sentence: "); gets(str); while (str[i] != '\0') if (str[i] != ' ') // check if this letter might be a beginning of a new word if ( (i==0) || // if this is the first letter (str[i-1] == ' ') ) // of if is a letter with space before it numOfWords++; { i++; printf("There are %d words in the sentence: |%s|\n", numOfWords, str);

הספריה string.h יש כל מיני פעולות נפוצות שניתן לבצע על מחרוזות, כגון: חישוב אורך, העתקה, שירשור וכד' מאחר ואלו פעולות נפוצות, שפת C מספקת לנו ספריה הנקראת string.h המכילה פונקציות שעושות את העבודה בשבילנו פונקציה היא קופסא שחורה המקבלת נתונים ומחזירה נתון אחר למשל, פונקציה המחזירה אורך של מחרוזת: “hello” 5

הפונקציה strlen #include <stdio.h> #include <string.h> void main() { char str1[] = "hello", str2[20], str3[]={'h','I','\0','h','I'}; int len1, len2, len3; printf("Please enter a string: "); gets(str2); len1 = strlen(str1); len2 = strlen(str2); len3 = strlen(str3); printf("The len of |%s| is %d\n", str1, len1); printf("The len of |%s| is %d\n", str2, len2); printf("The len of |%s| is %d\n", str3, len3); } הפונקציה strlen מקבלת מחרוזת ומחזירה את מספר התווים עד ה- ‘\0’ הראשון שבו נתקלה

הפונקציה strcpy ראינו שכדי להעתיק מערכים צריך לעבור בלולאה איבר-איבר עבור מחרוזות הספריה string.h מספקת לנו פונקציה המעתיקה תוכן מחרוזת אחת לאחרת בפקודה אחת: strcpy(dest, src) dest היא המחרוזת אליה נרצה להעתיק src היא המחרוזת ממנה נרצה להעתיק במקרה זה "הקופסא השחורה" מקבלת 2 מחרוזות, מעדכנת את המחרוזת dest ומחזירה אותה dest src dest

הפונקציה strcpy - דוגמא #include <stdio.h> #include <string.h> void main() { char str1[]="hello", str2[10]; printf("Before copy: str1=|%s|, str2=|%s|\n", str1, str2); strcpy(str2, str1); printf("After copy: str1=|%s|, str2=|%s|\n", str1, str2); }

הפונקציה strcpy - דגשים גם פה יש חשיבות לכך שהמחרוזת מסתיימת ב- ‘\0’ וההעתקה מבוצעת עד ה- ‘\0’בלבד אחריות המתכנת לוודא כי ב- dest מספיק מקום להכיל את src! הקומפיילר לא מתריע על כך, ובזמן ריצה אנו עלולים לדרוס זיכרון שאינו שלנו!

הפונקציה strcpy - דגשים char[]: str1 ‘h’ 1000 ‘e’ 1001 1002 ‘l’ 1003 1004 ‘o’ 1005 1006 char[]: str2 1007 1008 1009 ?? 1010 1011 1012 1013 1014 char[]: str1 ‘h’ 1000 ‘e’ 1001 1002 ‘l’ 1003 1004 ‘o’ 1005 1006 char[]: str2 ?? 1007 1008 1009 1010 1011 1012 1013 1014 #include <stdio.h> #include <string.h> void main() { char str1[]={'h','e',0,'l','l','o',0}, str2[8]; printf("Before copy: str1=|%s|, str2=|%s|\n", str1, str2); strcpy(str2, str1); printf("After copy: str1=|%s|, str2=|%s|\n", }

הפונקציה strcat פונקציה זו משרשרת מחרוזת אחת לסופה של אחרת: strcat(dest, src) dest היא המחרוזת אליה נרצה לשרשר לסופה src היא המחרוזת אותה נרצה להעתיק גם במקרה זה "הקופסא השחורה" מקבלת 2 מחרוזות, מעדכנת את המחרוזת dest ומחזירה אותה dest src dest

הפונקציה strcat - דוגמא #include <stdio.h> #include <string.h> void main() { char str1[20], str2[10]; printf("Please enter 2 strings: "); scanf("%s %s", str1, str2); printf("Before: str1:\t |%s|\t str2: |%s|\n", str1, str2); strcat(str1, str2); printf("After: str1:\t |%s|\t str2: |%s|\n", str1, str2); }

הפונקציה strcat – הוספת רווח #include <string.h> void main() { char str1[20], str2[10]; printf("Please enter 2 strings: "); scanf("%s %s", str1, str2); printf("Before: str1:\t |%s|\t str2: |%s|\n", str1, str2); strcat(str1, “ “); strcat(str1, str2); printf("After: str1:\t |%s|\t str2: |%s|\n", str1, str2); }

הפונקציה strcat - דגשים בדיוק כמו הדגשים של strcpy: גם פה יש חשיבות לכך שהמחרוזת מסתיימת ב- ‘\0’ והשירשור מבוצע עד ה- ‘\0’של המחרוזת המועתקת בשירשור אנו דורסים את ה- ‘\0’ של המחרוזת אליה משרשרים אחריות המתכנת לוודא כי ב- dest מספיק מקום להכיל את src! הקומפיילר לא מתריע על כך, ובזמן ריצה אנו עלולים לדרוס זיכרון שאינו שלנו!

הפונקציה strcat - הרצה ‘h’ ‘e’ ‘l’ ‘o’ ‘i’ ‘h’ ‘e’ ‘l’ ‘o’ ‘i’ char[]: str1 ‘h’ 1000 ‘e’ 1001 1002 ‘l’ 1003 1004 ‘o’ 1005 1006 char[]: str2 1007 ‘i’ 1008 1009 1010 1011 1012 1013 1014 char[]: str1 ‘h’ 1000 ‘e’ 1001 1002 ‘l’ 1003 1004 ‘o’ 1005 1006 char[]: str2 1007 ‘i’ 1008 1009 1010 1011 1012 1013 1014 #include <stdio.h> #include <string.h> void main() { char str1[]={'h','e',0,'l','l','o',0}, str2[10]="hi"; printf("Before cat: str1=|%s|, str2=|%s|\n", str1, str2); strcat(str2, str1); printf("After copy: str1=|%s|, str2=|%s|\n", str1, str2); }

דוגמא לשימוש בערך המוחזר מ- strcat עפ"י ההצהרה הרשמית, הפונקציות strcpy ו- strcat מחזירות את המחרוזת אותן שינו ברוב המקרים לא משתמשים בערך מוחזר זה (כי הנתון המקורי בכל מקרה התעדכן) #include <string.h> void main() { char str1[20]="hello", str2[20]="world"; strcat(str1, “ “); strcat(str1, str2); printf("str1 : |%s|\n", str1); strcat(strcat(str1, " "), str2);

הפונקציה strcmp השוואה בין מחרוזות היא השוואה לקסיקוגרפית (ולא לפי אורך המילה) כדי להשוות בין מספרים או תווים השתמשנו באופרטורים >,<,>=,<=,==,=! כדי להשוות בין מחרוזות לא נשתמש באופרטורים אלו, אלא בפונקציה strcmp, שהיא "הקופסא השחורה" הבאה: str1 str2 1/0/-1

הפונקציה strcmp (2) הפונקציה מקבלת 2 מחרוזות, ומחזירה: דוגמאות: 0 אם הם שוות 1 אם הראשונה גדולה מהשניה (כלומר במילון str1 תופיע אחרי str2) 1- אם הראשונה קטנה מהשניה (כלומר במילון str1 תופיע לפני str2) דוגמאות: str1=“hello”, str2=“world” יוחזר 1- str1=“world”, str2=“hello” יוחזר 1 str1=“hello”, str2=“hello” יוחזר 0 str1=“zz”, str2=“aaa” יוחזר 1 str1=“bb”, str2=“bbb”  יוחזר 1-

הפונקציה strcmp - דוגמא #include <stdio.h> #include <string.h> void main() { char str1[10], str2[10]; int res, fContinue=1; while (fContinue) printf("Please enter 2 strings, or '!' to exit: "); scanf("%s %s", str1, str2); if (strcmp(str1, “!") == 0 && strcmp(str2, “!") == 0) fContinue = 0; else res = strcmp(str1, str2); printf("The result of strcmp(str1, str2): %d\n", res); }

אפסים שונים המספר 0 ייוצג בזכרון ב- 4 בתים כמספר 0: התו '0' (ערכו האסקיי 48) ייוצג בזכרון בבית אחד: התו ‘\0’ (ערכו האסקיי 0) ייוצג בזכרון בבית אחד: המחרוזת "0" תייוצג בזכרון ע"י 2 בתים, מאחר וזו מחרוזת שהתו הראשון שלה מייצג את התו '0' והתא השני את התו ‘\0’ 00000000 00110000 00000000 00110000 00000000

מערך של מחרוזות אם נרצה לשמור טקסט בשורות נפרדות, נשתמש במערך של מחרוזות זוהי למעשה מטריצה של תווים למשל מטריצה עם LINES שורות, ובכל שורה מקסימום MAX_LETTERS תווים: char text[LINES][MAX_LETTERS]; כדי לפנות לתא מסוים במטריצה נפנה ע"י text[i][j] כדי לפנות לשורה שלמה (מחרוזת אחת), שהיא למעשה איבר במערך של מחרוזות נפנה ע"י text[i]

מערך של מחרוזות – דוגמא שורות בהן מופיע תו מסוים #define LINES 3 #define MAX_LETTERS 81 void main() { char text[LINES][MAX_LETTERS], ch; int i, j; printf("Please enter %d lines:\n", LINES); for (i=0 ; i < LINES ; i++) gets(text[i]); printf("Please enter a charchter to search: "); ch = getchar(); for (j=0 ; text[i][j] != '\0' ; j++) if (text[i][j] == ch) printf("The char %c appears in the line: |%s|\n", ch, text[i]); break; // stops inner for.. }

מערך של מחרוזות – דוגמא – מצא את השורה הארוכה ביותר (הנחה: יש לפחות שורה אחת בטקסט) ‘h’ ‘e’ ‘l’ ‘o’ ‘ ‘ ‘w’ ‘r’ ‘d’ ‘\0’ ‘g’ ‘m’ ‘n’ ‘i’ #define LINES 3 #define MAX_LETTERS 81 void main() { char text[LINES][MAX_LETTERS]; int i, maxLineLen=0, maxLineIndex, currentLen; printf("Please enter %d lines:\n", LINES); for (i=0 ; i < LINES ; i++) gets(text[i]); // find the longest line currentLen = strlen(text[i]); if (currentLen > maxLineLen) maxLineLen = currentLen; maxLineIndex = i; } printf("Longest line is #%d and is |%s|\n", maxLineIndex+1, text[maxLineIndex]);

הפונקציה sprintf מאפשרת לייצר פלט לתוך משתנה, במקום למסך void main() { char str[30]; int num; printf(“Enter a number: “); scanf(“%d”, &num); printf(“Your number is %d\n", num); sprintf(str, “Your number is %d", num); printf("str=|%s|\n", str);

הפונקציה sscanf מאפשרת לקרוא קלט מתוך משתנה, במקום מהמקלדת void main() { char classesAverage[] = "92.3 87.5 100"; float avg[3]; int i; sscanf(classesAverage, "%f%f%f", &avg[0], &avg[1], &avg[2]); printf("My classes average: "); for (i=0 ; i < 3 ; i++) printf("%.2f ", avg[i]); printf("\n");

קריאת המילה בתחילת הטקסט דילוג על המחרוזת הבאה ללא איכסונה במשתנה הפונקציה sscanf (2) השימוש בפונקציה גם מאפשר לדלג על כמות תווים כלשהי בעת קריאת המחרוזת, ע"י שימוש ב- %*s void main() { char str[30] = "Anna is 2 years old"; char name[10]; int age; sscanf(str, "%s %*s %d", name, &age); printf("My dog's name is %s and she is %d years old\n", name, age); קריאת המילה בתחילת הטקסט דילוג על המחרוזת הבאה ללא איכסונה במשתנה

char* strchr(const char* str, char ch) פונקציה המקבלת מחרוזת ותו, ומחזירה את הכתובת של המופע הראשון של התו במחרוזת, NULL אם לא קיים char* strchr(const char* str, char ch)

הפונקציה strchr -דוגמא void main() { char str[] = “abcdef"; char* pos; char ch = ‘c'; printf("|%s| appears at address %p\n\n", str, str); pos = strchr(str, ch); if (pos != NULL) printf("'%c' appears first at address %p (index=%d)\n", ch, pos, pos-str); else printf("'%c' is not in the string\n", ch); ch = 'm'; } char[]: str ‘a’ 1000 ‘b’ 1001 ‘c’ 1002 ‘d’ 1003 ‘e’ 1004 ‘f’ 1005 1006 char*: pos NULL 1007 char: ch ‘m’ 1011 char[]: str ‘a’ 1000 ‘b’ 1001 ‘c’ 1002 ‘d’ 1003 ‘e’ 1004 ‘f’ 1005 1006 char*: pos 1007 char: ch ‘m’ 1011 char[]: str ‘a’ 1000 ‘b’ 1001 ‘c’ 1002 ‘d’ 1003 ‘e’ 1004 ‘f’ 1005 1006 char*: pos ??? 1007 char: ch 1011 char[]: str ‘a’ 1000 ‘b’ 1001 ‘c’ 1002 ‘d’ 1003 ‘e’ 1004 ‘f’ 1005 1006 char*: pos 1007 char: ch 1011

char* strstr(const char* str1, פונקציה המקבלת 2 מחרוזות, ובודקת האם המחרוזת השניה היא תת-מחרוזת בראשונה. אם כן, מתחילה את כתובת תחילת הרצף בראשונה, אחרת מחזירה NULL char* strstr(const char* str1, const char* str2)

הפונקציה strstr -דוגמא char[]: str ‘a’ 1000 ‘b’ 1001 ‘c’ 1002 ‘d’ 1003 ‘e’ 1004 ‘f’ 1005 1006 char*: pos NULL 1007 char[]: sub 1011 1012 1013 1014 char[]: str ‘a’ 1000 ‘b’ 1001 ‘c’ 1002 ‘d’ 1003 ‘e’ 1004 ‘f’ 1005 1006 char*: pos 1007 char[]: sub 1011 1012 1013 1014 char[]: str ‘a’ 1000 ‘b’ 1001 ‘c’ 1002 ‘d’ 1003 ‘e’ 1004 ‘f’ 1005 1006 char*: pos ??? 1007 char[]: sub 1011 1012 1013 1014 char[]: str ‘a’ 1000 ‘b’ 1001 ‘c’ 1002 ‘d’ 1003 ‘e’ 1004 ‘f’ 1005 1006 char*: pos 1007 char[]: sub 1011 1012 1013 1014 void main() { char str[] = "abcdef“, *pos, subStr[] = "cde“; printf("|%s| appears at address %p\n\n", str, str); pos = strstr(str, subStr); if (pos != NULL) printf("|%s| starts at address %p (index=%d)\n\n", subStr, pos, pos-str); else printf("|%s| is not a sub-string\n", subStr); strcpy(subStr, "cdd“); printf("|%s| starts at address %p (index=%d)\n", subStr, pos, pos-str); }

איתחול מצביע למחרוזת קבועה ראינו איתחול מחרוזת: char str[] = “Hi”; ניתן לאתחל מצביע למחרוזת כך: char* str = “Hi”; char[]: str ‘H’ 1000 ‘i’ 1001 ‘\0’ 1002 char*: str 2500 1000 char ‘H’ 2500 ‘i’ 2501 ‘\0’ 2502 str יכיל את כתובת ההתחלה של המערך כאשר מאתחלים מצביע למחרוזת בצורה זו המערך נשמר בזיכרון הנקרא static storage כל פעולה שניתן לבצע על מערך ניתן לבצע על מערך תווים זה (פרט לשינוי ערכי המערך) זיכרון ה- static storage

ה- static storage זהו שטח זיכרון המכיל מחרוזות סטטיות שהוגדרו בזמן קומפילציה, ושלא הוקצה להן שטח זיכרון על ה- heap, כמו בדוגמאת איתחול מצביע למחרוזת: char* str = “Hi”; זיכרון זה הינו סטטי ולא ניתן לשנות את תוכנו: int main() { char* str = "hhhhh"; scanf("%s", str); }

מערך של מצביעים למחרוזות - דוגמא int main() { char* arr[3] = {"This", "is", "nice"}; printf("%c\n", (*(arr+2))[1]); } (*(arr+2))[1] ≡ *(*(arr+2)+1) char*[]: arr ??? 1000 1004 1008 char*[]: arr 2500 1000 2600 1004 3200 1008 1000 1008 3200 i char ‘n’ 3200 ‘i’ 3201 ‘c’ 3202 ‘e’ 3203 ‘\0’ 3204 char ‘T’ 2500 ‘h’ 2501 ‘i’ 2502 ‘s’ 2503 ‘\0’ 2504 char ‘i’ 2600 ‘s’ 2601 ‘\0’ 2602 זיכרון ה- static storage

דוגמא: הדפסת איברי מערך של מחרוזות int main() { char* words[] = {"Hi", "Bye", "Nice"}; char** ptr; int numOfWord = sizeof(words)/sizeof(words[0]); for ( ; ; ) printf("Day: %s \t2nd letter: %c\n", *ptr, *(*ptr+1)); words 2600 3200 2500 “Hi” “Bye” “Nice” ptr 1012 ptr=words ptr < words+numOfWords ptr++ char ‘B’ 3200 ‘y’ 3201 ‘e’ 3202 ‘\0’ 3203 char ‘N’ 2500 ‘i’ 2501 ‘c’ 2502 ‘e’ 2503 ‘\0’ 2504 char*[]: words 2600 1000 3200 1004 2500 1008 char**: ptr 1012 int: numOfWords 3 1016 char*[]: words 2600 1000 3200 1004 2500 1008 char**: ptr 1012 int: numOfWords 3 1016 char*[]: words ??? 1000 1004 1008 char**: ptr 1012 int: numOfWords 1016 char*[]: words 2600 1000 3200 1004 2500 1008 char**: ptr 1012 int: numOfWords 3 1016 char*[]: words 2600 1000 3200 1004 2500 1008 char**: ptr ??? 1012 int: numOfWords 1016 char*[]: words 2600 1000 3200 1004 2500 1008 char**: ptr ??? 1012 int: numOfWords 3 1016 char*[]: words 2600 1000 3200 1004 2500 1008 char**: ptr 1012 int: numOfWords 3 1016 char ‘H’ 2600 ‘i’ 2601 ‘\0’ 2602 זיכרון ה- static storage

char* strtok(char*, const char*) הפונקציה מפרקת מחרוזת ל- token'ים עפ"י תווי הפרדה למשל: המחרוזת “AKA: as know as” ותווי ההפרדה ' ' ו- ':' יוחזרו ה- token'ים הבאים: AKA as known as

char* strtok(char*, const char*) הפונקציה מקבלת מחרוזת text ומחרוזת נוספת המכילה תווי הפרדה, delimiters, ומבצעת את הדברים הבאים: מחליפה את המופע הראשון ב- text המכיל את אחד מהתווים שב- delimiters ב- '0\'  המחרוזת text אינה יכולה להיות const מחזירה את הכתובת של תחילת ה- token כדי לקרוא ל- strtok מהמקום בו הפסיקה בפעם הקודמת יש לקרוא לה עם NULL מחזירה NULL כאשר מגיעה לסוף המחרוזת

strtok – דוגמא void main() { char str[] = "Hello World!"; char* delimiters = " :-,"; char* words; printf("The words in the sentence:\n"); words = strtok(str, delimiters); while (words != NULL) } printf("%s\n", words); words = strtok(NULL, delimiters); printf("The orig sentense: %s\n", str); 1012 1011 1010 1009 1008 1007 1006 1005 1004 1003 1002 1001 1000 \0 ! d l r o W e H 1012 1011 1010 1009 1008 1007 1006 1005 1004 1003 1002 1001 1000 \0 ! d l r o W e H str words

strtok – דוגמא נוספת void main() { char str[] = "This is: a lovely - SENTENCE"; char* delimiters = " :-,"; char* words; printf("The words in the sentence:\n"); words = strtok(str, delimiters); while (words != NULL) } printf("%s\n", words); words = strtok(NULL, delimiters);

ביחידה זו למדנו: הפקודות: מהי מחרוזת איתחול מחרוזת gets, puts getchar, putchar, getch, getche מהי מחרוזת איתחול מחרוזת gets, puts הספריה string.h: strlen, strcpy, strcmp, strcat מערך של מחרוזות הפונקציות: sprintf, sscanf strchr, strstr, strtok static storage

תרגיל 1: כתוב תוכנית המגדירה 3 מערכים של מחרוזות (מטריצות) (text1, text2, text3) באותו הגודל וקרא נתונים ל-2 המטריצות הראשונות. הפונקציה תשים מחרוזות ב-text3 באופן הבא: במידה והאורך הכולל של השורה המתאימה ב- text1 וב- text2 קטן מאורך שורה אפשרית, נעתיק את השורה המתאימה מ- text1 ל- text3 ואח"כ נשרשר את השורה המתאימה מ- text2. אחרת נשים ב- text3 שורה ריקה. לבסוף התוכנית תדפיס את text3. שימו לב: במידת הצורך יש להשתמש בפונקציות שלמדנו, ולא "להמציא את הגלגל מחדש"!! דוגמא לפלט לתוכנית:

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

תרגיל 3: הגדר מטריצה של תווים (מערך של מחרוזות) וקרא לתוכו קלט. הגדר מחרוזת וקרא לתוכה קלט. הדפס כמה שורות במטריצה זהות למחרוזת. דוגמא: עבור המחרוזת Hi והשורות הבאות במטריצה: Hi Good Good morning This is nice! התוכנית תדפיס 2 משום שהמחרוזת Hi מופיעה פעמיים במטריצה.