עבור לתוכן

++C מחרוזות

Featured Replies

פורסם

בניצי מחלקה לייצוג מחרוזת 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 הראשון שהצהרתי עליו,למה זה?

פורסם

לגבי השאלה השנייה:

כשמצהירים על אובייקט עם constructor דיפולטי (כלומר שלא מקבל פרמטרים), אז אסור לשים סוגריים.

כלומר את צריכה להצהיר על a כך:

String a;

פורסם

ב- 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.

פורסם
  • מחבר

איך אני מסמנת מצביע למחרוזת (על מנת שאוכל לעבור עליה????)



char *p=str;

לא עובד!!!!

פורסם
  • מחבר

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.

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

פורסם
  • מחבר

וואווווווו זה עובד !!!!!!!!!!

תודה על ההכרות עם הפונקציה strchr

:yelclap:

פורסם
  • מחבר

עוד שאלה:

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

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

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

:s05:

פורסם

נא לקרוא בספריה על strtok.

בתלות בקומפיילר, סביר להניח שיש גם גרסה יותר בטוחה שנקראת strtok_r.

פורסם
  • מחבר

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

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


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

מה עושים?

פורסם

את ציכה לשלוח את הDATA MEMBER שיצרת בתוך הסטרינג.

ארכיון

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

דיונים חדשים