++C מחרוזות - תכנות - HWzone פורומים
עבור לתוכן
  • צור חשבון

++C מחרוזות


נעמה.

Recommended Posts

בניצי מחלקה לייצוג מחרוזת String



String::String()
{
str=NULL;
}

String::String(char* s)//defualt Constructor
{
if(s)//אם המחרוזת לא ריקה
{
int l=strlen(s);//נבדוק את אורכה
str=new char[l+1];//נקצה למערך בו איבר נוסף מגודל המחרוזת
strcpy(str,s);//נעתיק את המחרוזת
}
else// -אם המחרוזת ריקה
{
str=NULL;// // המצביע לא מצביע על כלום
}
}

String::String(const String &s)//copy Constructor
{
if(s.getString())//אם המחרוזת ממנה נעתיק ריקה
{
int l=strlen(s.getString());//בדיקת אורכה
str=new char[l+1];// '\0' הקצאת למחרוזת חדשה שיש לה מקום נוסף עבור
strcpy(str,s.getString());//העתקת המחרוזת
}
else//אם המחרוזת ריקה
{
str=NULL;//המצביע לא מצביע על כלום
}
}

String::~String()//פונקציה 'הורסת'-מחיקה
{
if (str)//אם המחרוזת לא ריקה
delete [] str;//נשחרר את הזכרון שהוקצה לה
str=NULL;//נאפס את המחרוזת
}

char* String::setString()//פונקציה להחזרת המחרוזת
{
char* s;
cout<<"\nEnter a string: ";
cin>>s;
int l=strlen(s);
str=new char[l+1];
strcpy(str,s);
return str;
}

char* String::getString()const
{
return str;
}

מה צריכה להכיל פונקציה לקליטת מחרוזת מהמשתמש? (setString)

ופונקציה שמעתיקה ממחרוזת קיימת החל מתו מסוים למחרוזת חדשה?

ועוד בעיה: בתכנית הראשית ע"מ להצהיר על מחרוזת String a() אני חייבת לשים לכל הפחות גרשיים בתוך הסוגריים ,למרות ה constructor הראשון שהצהרתי עליו,למה זה?

קישור לתוכן
שתף באתרים אחרים

ב- setString, כשאת קוראת מחרוזת, את לא יכולה להשתמש ב- cin>> עם מצביע שלא מאותחל, אלא חייבת להעביר מצביע למערך שכבר הוקצה.

הבעיה, כמובן, היא שאת לא יודעת מה אורך הקלט.

אם יש לך אורך מקסימלי - את יכולה להקצות מערך בגודל הזה.

אם לא, את יכולה להקצות מערך בגודל מסויים, ולהשתמש ב- cin.get (או אחת הוריאציות האחרות שלה) כדי לקרוא בכל פעם מספר תוים, ולצרף אותם למערך אחד.

קישור לתוכן
שתף באתרים אחרים

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

אחר כך את צריכה ליצור פוינטר שיאותחל ב- (str+i1), ואת צריכה לשים ב- str[i2] סימון לסוף המחרוזת, ופשוט ליצור אובייקט String חדש עם הפויינטר החדש שיצרת, ובסוף להחזיר את התו שהיה ב- i2(שימי לב שאת מקצה מקום בCTOR שלך, ככה שזה לא יהרוס את הSTRING הישן).

קישור לתוכן
שתף באתרים אחרים

לא הבנתי איך אני מעתיקה מחרוזת החל תו מסוים!!!

איך עושים את זה??

ניסיתי להצהיר על מחרוזת חשדה ריקה, אליה אעתיק את החלק המבוקש ו.????

זה מה שעשיתי (רצת בלאגן):



String temp;

char p=str, q=temp;
while((p!=NULL)&&(*p!=tav))
{
p++;
}

if(p==NULL)
{
return p;
}

else
{
p++;
while(p!=NULL)
{
*q=*p;
p++;
q++;
}
}

return q;

קישור לתוכן
שתף באתרים אחרים

נניח שאת רוצה להעתיק את מחרוזת SRC החל מהתו השלישי (בהנחה שהיא מספיק ארוכה!) אל תוך מחרוזת DST:

strcpy(dst, src+3);

הערה: כמובן לא לערבב ASCII עם UNICODE.

קישור לתוכן
שתף באתרים אחרים

str הוא מטיפוס char * כתבתי את הפונקציה הזו:


String temp;
char *p=str;
char *q=temp;
int i=0;

while ((q!=NULL)&&(*q!=c))
{
q++;
i++;
}
if(q!=NULL)
{
strcpy(temp, str+i);
}

return temp;

ואלו ההערות שהקומפיילר מחזיר:


'initializing' : cannot convert from 'String' to 'char *'
'strcpy' : cannot convert parameter 1 from 'String' to 'char *'

קישור לתוכן
שתף באתרים אחרים

Duh!

כי temp הוא String ולא char*.

חוץ מזה כדי לחפש תו בתוך מחרוזת אל תכתבי לולאה בעצמך, יש את strchr שמחזיר מצביע למופע הראשון של תו בתוך מחרוזת (או NULL אם הוא לא שם, נדמה לי). תסתכלי קצת בתיעוד ותשתמשי בו כדי למצוא את c בתוך q.

אגב שמות נורמליים יותר למשתנים רק יכולים להועיל.

קישור לתוכן
שתף באתרים אחרים

עוד שאלה:

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

איך עושים את זה?

נגיד אני קוראת לפונקצית עזר שבכל פעם תחזיר לי חלק מהמחרוזת (את החלק הקיים בין התו המסוים) מה צריך להיות קוד הפונקציה??? ואיך היא מחלקת?

:s05:

קישור לתוכן
שתף באתרים אחרים

משהו לא מסתדר!!!!

s היא מחרוזת מסוג String ואילו הפונקציה strchr משמתמשת באיברים מסוג const char str [ ], הקומפיילר רושם לי הערה כזו:


error C2664: 'strchr' : cannot convert parameter 1 from 'String' to 'const char *'

מה עושים?

קישור לתוכן
שתף באתרים אחרים

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

×
  • צור חדש...