c programming tutorial - בקלות C++
מדריכי תכנות

שיעור 9: מחרוזות

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

ההגדרה של מחרוזת תהיה כל דבר שמכיל מספר תווים (יותר מתו אחד) קשורים ביחד. לדוגמא, "this" היא מחרוזת. אולם, תווים בודדים לא יהיו מחרוזות, למרות שניתן להשתמש בהם כמחרוזות.

מחרוזות הן מערכים של תווים. מחרוזות סטטיות הן מילים המוקפות במירכאות כפולות.

"זוהי מחרוזת"

כדי להצהיר על מחרוזת של 50 אותיות, תרצה לומר:

char string[50];

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

הערה:

;char *arry גם יכול לשמש כמחרוזת. אם קראת את השיעור על מצביעים, ניתן לעשות משהו כמו:

arry = new char[256];

שמאפשר לך לגשת ל arry כאילו זה היה מערך. זכור שכדי להשתמש ב delete עליך לשים [] בין delete ו arry כדי לומר לו לשחרר 256 בתים של זיכרון שהוקצה.

לדוגמא,

delete []arry;

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

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

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

אב הטיפוס לפונקציה הוא:

cin.getline(char *buffer, int length, char terminal_char);

ה char *buffer הוא מצביע לאלמנט הראשון של מערך תווים, כך שניתן יהיה להשתמש בו כדי לגשת ממש למערך. ה int length הוא פשוט כמה מחרוזת הקלט יכולה להיות במקסימום שלה (כמה גדול המערך). ה char terminal_char פירושו שהמחרוזת תסתיים אם המשתמש מכניס כקלט את התו הזה. זכור שהיא לא תכניס את ה terminal_char למחרוזת.

ניתן ליצור קריאה לפונקציה של cin.getline(arry, '\n'); בלי האורך, או להפך, cin.getline(arry, 50); בלי תו הסיום. שים לב ש n\ הוא הדרך לומר למעשה למהדר שאתה מתכוון לשורה חדשה, כלומר שמישהו הקיש על מקש ה return.

לדוגמא:

#include <iostream.h>

int main()
{
  char string[256];   //A nice long string
  cout<<"Please enter a long string: ";
  cin.getline(string, 256, '\n'); //The user input goes into string
  cout<<"Your long string was:"<<endl<<string;
  return 0;
}

זכור שאתה למעשה מעביר את הכתובת של המערך כאשר אתה מעביר מחרוזת כיוון שמערכים לא מצריכים שימוש באופרטור התייחסות (&) כדי להעביר את הכתובת שלהם. מלבד זאת, אתה יכול להפוך את ה n\ לאיזה תו שאתה רוצה (וודא ששמת אותו בתוך מירכאות בודדות כדי ליידע את המהדר לגבי הסטטוס שלו כתו) כדי ש getline תסתיים באותו תו.

string.h הוא קובץ כותרת שמכיל הרבה פונקציות לטיפול במחרוזות. אחת מהן היא פונקצית השוואת המחרוזות.

int strcmp(const char *s1, const char *s2);

strcmp תקבל שתי מחרוזות. היא תחזיר מספר שלם. המספר השלם יהיה:
שלילי אם s1 קטנה מ s2.
אפס אם s1 ו s2 שוות.
חיובי אם s1 גדולה מ s2.

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

int strcmpi(const char *s1, const char *s2);

strcmpi תקבל שתי מחרוזות. היא תחזיר מספר שלם. המספר השלם יהיה:
שלילי אם s1 קטנה מ s2.
אפס אם s1 ו s2 שוות.
חיובי אם s1 גדולה מ s2.

strcmpi אינה רגישה להבדל בין אותיות גדולות וקטנות, אם המילים הן באותיות גדולות לא אכפת לה. זה לא ANSI C++.

char *strcat(char *desc, chat *src);

strcat זה קיצור ל string concatenate (שרשור מחרוזות), שמשמעותו לחבר לסוף, או לשרשר. הפונקציה מחברת את המחרוזת השניה לראשונה. היא מחזירה מצביע למחרוזת המשורשרת.

char *strupr(char *s);

strupr ממירה מחרוזת לאותיות גדולות. גם היא מחזירה מחרוזת, שתהיה כולה באותיות גדולות. מחרוזת הקלט, אם היא מערך ולא מחרוזת סטטית, תהיה גם כולה באותיות גדולות. זה לא ANSI C++.

char *strlwr(char *s);

strlwr ממירה מחרוזת לאותיות קטנות. גם היא מחזירה מחרוזת, שתהיה כולה באותיות קטנות. מחרוזת הקלט, אם היא מערך, תהיה גם היא כולה אותיות קטנות.

size_t strlen(const char *s);

strlen תחזיר את האורך של מחרוזת, פחות התו המסיים (/0). ה size_t לא צריך להדאיג אותך. פשוט תתייחס אליו כמספר שלם, שזה מה שהוא.

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

#include <iostream.h>   //For cout
#include <string.h>     //For many of the string functions

int main()
{

  char name[50];            //Declare variables
  char lastname[50];    //This could have been declared on the last line...
  cout<<"Please enter your name: ";   //Tell the user what to do
  cin.getline(name, 50, '\n');   //Use gets to input strings with spaces or 
			//just to get strings after the user presses enter

  if(!strcmpi("Alexander", name))  //The ! means not, strcmpi returns 0 for
  {                                //equal strings
    cout<<"That's my name too."<<endl; 
					//Tell the user if its my name

  }
  else                              //else is used to keep it from always 
    {						//outputting this line
     cout<<"That's not my name."	 
  } 

   cout<<"What is your name in uppercase..."<<endl; 
  strupr(name);                   //strupr converts the string to uppercase
  cout<<name<<endl;               
  cout<<"And, your name in lowercase..."<<endl;
  strlwr(name);                   //strlwr converts the string to lowercase
  cout<<name<<endl;
  cout<<"Your name is "<<strlen(name)<<" letters long"<<endl;  
				//strlen returns the length of the string
  cout<<"Enter your last name:";
  gets(lastname);               //lastname is also a string
  strcat(name, " ");		//We want to space the two names apart
  strcat(name, lastname);      	//Now we put them together, we a space in 
				//the middle
  cout<<"Your full name is "<<name; //Outputting it all...
  return 0;

}



לדף הראשון

<< לדף הקודם

לדף הבא >>