מידע מורחב

  • תאריך
  • שעה 18:10
  • ע"י
  • צפיות 18914
  • תגובות 5
  • דירוג 5 /5
 

++C למתחילים - חלק שביעי: מחרוזות

May07
במדריך זה נלמד על תווים, מחרוזות ועל הפונקציות בספריית cstring.

כבר הזכרנו בעבר כי מחרוזת היא בעצם מערך של תווים. אז בואו נבחן את המשתנה תו char יותר בקפידה.
הצהרה על משתנה char נעשית באופן הבא:

char c;



כעת, הזכרנו כי משתנה זה מכיל ערכים מטבלת אסקיי ASCII.

מהי טבלת ASCII ?

ASCII הם ראשי תיבות של American Standard Code for Information Interchange.
טבלת ASCII היא בעצם טבלה שמכילה ערכים לייצוגם של תווים במחשב.


להלן טבלת ASCII:


בכל חלק בטבלה, בצד השמאלי ישנם מספרים עם d שזה המספרים הרגילים (d מציין decimal, שיטת הספירה עבור בסיס 10).
מספרים עם h הם מספרים בהקסה-דצימל, כלומר בבסיס 16.
בעמודה השלישית יש את הסמל שהמספר מציין, כאשר הוא מוצג במחשב.
בעמודה הרביעית יש את שמות הסמלים, במידה ואין סמל אז ניתן לראות מה הסמל, כמו למשל בקוד מספר 9, שהוא tab.

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

טוב כעת, אם נעשה את הפקודה הבאה:

c = 65;


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

c = 'A';


פעולה זו בעצם מכניסה לתוך c את הערך 65, בדיוק כמו מקודם.

נתבונן בפקודות הבאות:

c = 65; 
cout << c << endl; //print A 
c = 'B' 
cout << c << endl; //print B 
c = 'B' 
c++; //c is now 67 or 'C' 
cout << c << endl; //print C 
cout << int(c) << endl; //print 67



בפקודה האחרונה אילצנו את פקודת הפלט להציג את הערך המספרי של c, ולכן הוצג 67.

כעת נציג תוכנית המדפיסה את כל ה- ABC האנגלי, כולל אותיות קטנות.

char letter; 
for (letter = 65; letter < 123; letter++) 
      cout << letter << " ";



חושב להזכיר כי ניתן להכניס לתוך משתנה char רק תו אחד בודד, ולא מחרוזת.


מחרוזות
מחרוזת היא מערך של תווים, ומוגדרת כמו שלמדנו להגדיר מערך:

char str[6];


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

ניתן להכניס בהכרזה עצמה נתונים לתוך התאים בצורה הבאה:

char str[6] = "Hello"; 
char str[] = "Hello";



בהכרזה הראשונה אנו מכניסים לתוך המשתנה את המילה Hello. (נתעלם מהתו האחרון)



בהכרזה השנייה אנו גם מכניסים לתוך המשתנה את המילה Hello, אך פה לא הצהרנו על גודל המשתנה, לכן הקומפיילר הולך לצד ימין של השווה, בודק כמה תאים יש שם ואז מגדיר לבד את המשתנה בגודל של מספר התווים + 1.

רגע, למה + 1 ? מה זה התו הזה שכל כך צריך אותו ?

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

לכן הוחלט לסמן את סוף המילה בתו '0/' ובכך פונקצית הדפסה תדפיס תו תו במערך עד אשר תיתקל בתו זה ותסיים את פעולתה.

לכן אם אתם מתכוונים להשתמש בפונקציות מספריית cstring, עליכם לדאוג שתמיד יהיה '0/' בסוף המילה.

אם ישנה המילה:


ואנו רושמים את הפקודה הבאה:

cout << str << endl;



יודפסו כל התווים עד התו '0/' הראשון, כלומר יודפס רק Hel.

כשאנו עושים השמה ישר באיתחול, המערכת מוסיפה אוטומטית '0/' בסוף המילה.


הכרזה נוספת היא:

char str[] = {'H','e','l','l','o'};



באופן זה נקבל מערך כזה:


הקומפיילר קורה כמה ערכים יש מצד ימין של השווה, ומקבל כי יש 5 ערכים, אך מכיוון שהצהרנו בדיוק על הערכים שאותם נרצה להכניס בסוגריים מסולסלים, הוא יכניס אותם ורק אותם ולא יוסיף '0/'.


ספריית cstring

ספריית cstring היא ספריית פקודות עזר לעבודה עם מחרוזות.

הוספת הספרייה היא בדיוק כמו הוספת ספריית iostream:

#include <cstring>


כעת כל פקודה שנרצה להשתמש בה, כמו למשל הפקודה strlen נצטרך קודם להצהיר עליה באופן הבא:

using std::strlen;



או אם ברצונכם להשתמש בפקודה זו מספר קטן של פעמים ניתן לוותר על ההצהרה, ולהוסיף את std:: בכל תחילה של הפקודה כך:

std::strlen(str);


כעת נבחן את הפקודות הבאות, חשוב להזכיר כי חייב להיות '0/' בסוף המילה:


(strlen (string length

פקודה זו מקבלת מחרוזת, ומחזירה את אורכה של המחרוזת (ללא '0/').

מבנה הפקודה הוא:

strlen(מחרוזת);


דוגמא:

char str[] = "Hello"; 
int len; 
len = strlen(str); 
cout << len << endl; //print 5



(strcmp (string compare
פקודה זו מקבלת 2 מחרוזות, ומחזירה האם הם שוות או לא.

הערך שהפקודה מחזירה הוא ערך מספרי, כאשר הוא 0 אז המחרוזות שווה, כאשר הוא שלילי המחרוזת השנייה יותר גדולה (מבחינה אלפבתית) וכשהערך חיובי אז המחרוזת הראשונה יותר גדולה. למעשה הוא עושה str1-str2, כאשר הפקודה נראית כך :

strcmp(מחרוזת1,מחרוזת2);



דוגמא:

char str1[] = "Hello"; 
char str2[] = "hello"; 
int dif; 
dif = strcmp(str1,str2); //str1-str2, dif is negative



(strcpy (string copy
פקודה זו מקבלת 2 מחרוזות, ומעתיקה את המחרוזת השנייה לתוך הראשונה.

מבנה הפקודה הוא:

strcpy(יעד,מקור);



דוגמא:

char str1[] = "Hello"; 
char str2[6]; 
strcpy(str2,str1); 
cout << str2 << endl; //print Hello


ננסה לבנות בעצמנו את הפונקציה:

void mystrcpy(char str1[], char str2[]) 
{ 
      int counter = 0; 
      while (str2[counter] != '/0') 
      { 
            str1[counter] = str2[counter]; 
            counter++; 
      } 
      str1[counter] = ''; 
}



בנינו פונקציה שעושה אותה פעולה בדיוק, אך היא טיפה פחות יעילה מהפונקציה הממומשת בספרייה cstring, מכיוון שיש בה דברים שעדיין לא למדנו.


(strcat (string concatenate
פקודה זו מקבלת 2 מחרוזות, ומעתיקה את המחרוזת השנייה לתוך הראשונה.

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

מבנה הפקודה הוא:

strcat(יעד,מקור);



דוגמא:

char str[100] = "Hello"; 
strcat(str,", How"); 
strcat(str," are"); 
strcat(str," you ?"); 
cout << str << endl; //print Hello, How are you ?



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


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


וכרגיל, מקווה שנהנתם.

במדריך הבא נסקור שיטות מיון של מערכים.
עדיין לא נרשמת לאתר ? לחץ כאן להרשמה מהירה
נא המתן...
דירוג
  1. היי זה מדריך C++ נכון, אז למה לא להשתמש באובייקט המוגדר בשפה כבר למחרוזת, string.
    למה להמשיך ולייצג מחרוזת כמו שמייצגים ב C?
  2. קודם כל צודק, באמת יש אפשרות מומלצת להשתמש ב- string.
    במדריך הזה שמתי דגש על איך באמת עובדת השפה וגם האובייקט string. אני מאמין שכאשר מבינים דברים לעומק אז אח"כ מתכנתים טוב יותר ומבינים למה קורים דברים שלעיתים קשה להסביר.
  3. צודק שתמיד רצוי להבין לעומק איך מיוצגים הדברים ואיך הם "נבראו" אבל אפילו איזכור ל string לא היה פה, לכן משתמש שרוצה ללמוד לא מודע אפילו למחלקה.

    הייתי מוסיף על זה כמה מילים, לשיקולך :)
  4. אני כבר פחות בתחום של ++C, אשמח אם תוכל להגיד על זה כמה מילים בתגובה (אפשר גם לצרף קוד כאן)
    תודה!
  5. string מהו? כמובן כשמו כן הוא הוא מיכל המחזיק מחרוזות.
    התפלאו לשמוע אבל string נחשב למיכל מישני לעומת מיכלים כמו וקטור ורשימה שהם עיקריים, ומיכלים משניים כמו string כנראה משתמשים באחד מהעיקריים בממימוש שלהם.
    קודם כל על מנת להשתמש במחלקה string עליכם לאנקלד את הספרייה
    #include <string>

    בנוסף המחלקה נמצאת במרחב השמות std, לכן עומדות בפניכם 2 אפשרויות לכלול את כל מרחב השמות או להשתמש רק ב string
    using namespace std;	// include all the std namespace
    using std::string;	// include only the string class
    

    מפה האפשרויות הן לא מוגבלות, האופרטורים הבאים מועמסים על המחלקה string
    + - מאפשר לשרשר בין 2 מחרוזות
    = - מציב מחרוזת אחת לשניה
    == - משווה בין 2 מחרוזות
    != - בודק אי שוויון בין 2 מחרוזות
    > < >= <= - בודק האם גדול/קטן לקסיקוגרפי
    האופרטור [] על מנת לגשת לתו במיקום מסוים
    =+ - על מנת להוסיף לסוף ההמחרוזת מחרוזת נוספת (עוד סוג של שרשור).

    אתם מוזמנים לעיין פה בכל הממשק שהשפה מציעה לגבי המחלקה string
    http://www.cplusplus.com/reference/string/string


עליך להתחבר כדי להגיב. לחץ כאן להתחברות.