ABA


"שאלה בסי | remove a string"
גירסת הדפסה        
קבוצות דיון פיתוח, תיכנות ובניית אתרים נושא #15523 מנהל    סגן המנהל    מפקח   Winner    צל"ש   מומחה  
אשכול מספר 15523
ronen333 
חבר מתאריך 20.2.03
6069 הודעות
   11:05   01.11.09   
אל הפורום  
  שאלה בסי | remove a string  
 
   ניסתי לעשות פונקציה שמוחקת את הסטרינג ST2 מST כל פעם שהוא מופיע בST.
אבל משום מה לא עובד טוב, ניסתי לעבור עם הDEBUG אבל לא הצלחתי להבין למה התכנון שלי לא עובד כמו שצריך.

הרעיון שלי הוא כזה: פונקציה אחת תמחק את הסטרינג פעם אחת ותחזיר אם מחק או לא.
אופן פעולה: מחפש את הסטרינג דרך הפונקציה strstr ומחליף את התו הראשון בNULL TERMINATOR ולקדם את המצביע באורך של ST2+1 כדי להגיע להמשך, ואז לעשות STRCAT כדי לאחד את ההמשך עם ההתחלה.

ופונקציה שניה שמבצעת את העבודה כל עוד יש מה למחוק.


char * delete_all_string(char * st,char * st2)
{

int flag=1;
while(flag)
{
flag=delete_string(st,st2);
}

return st;
}
int delete_string(char *st,char * st2)
{
char * ptr=strstr(st,st2);
int len=strlen(st2);
if(ptr!=NULL)
{
*ptr='\0';
ptr+=len+1;
strcat(st,ptr);
return 1;
}
return 0;
}


מסיבה מסוימת זה לא מוחק את הפעם השניה אם אני נניח שולח לפונקציה

char st1="aviad b aviad";
char st2="aviad";
puts(delete_all_string(st1,st2));


                                שתף        
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד

  האשכול     מחבר     תאריך כתיבה     מספר  
  קח מימוש קצר ממה שאני זוכר ב c..אפשר לייעל בזכרון VeNom  01.11.09 12:28 1
     אחי ronen333  01.11.09 12:49 2
         מרצה? ldan192  01.11.09 20:10 4
             אותו בן אדם ronen333  02.11.09 14:57 7
  גרר..שכחתי להמיר סוגריים מרובעים... ronen333  01.11.09 12:59 3
  לא רואה ישורים ובלגאנים. תעלה כ-TXT ldan192  01.11.09 20:11 5
     Here ronen333  02.11.09 14:41 6
         מה עושה בדיוק strstr הזו? ldan192  02.11.09 20:28 8
             strstr היא פונקציה סטנדרטית בSTRING.H ronen333  02.11.09 23:17 9
                 הבנתי. תשמע, יש כמה טעויות תכנתיות מסוכנות שיכולות ldan192  03.11.09 22:04 10
                     עידן? P= אני חושב שעבר אותו מחר ממזמן.. ronen333  14.11.09 10:40 11
                         חחח ברח לי מהראש. תזכיר לי מה רצית שאכין? ldan192  14.11.09 16:39 12
                             חחח HEADS UP ronen333  14.11.09 21:23 13

       
VeNom  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 7.6.02
7922 הודעות, 1 פידבק
   12:28   01.11.09   
אל הפורום  
  1. קח מימוש קצר ממה שאני זוכר ב c..אפשר לייעל בזכרון  
בתגובה להודעה מספר 0
 
   עם קאונטר וריאלוק בסוף ריאלוק בסוף..אבל זה בקטנה..

char str() = "aviad my name is aviad aviad";
char* strTokHelper = NULL;
char* output = (char*)malloc(sizeof(str) 1);//output string..you can use a counter and realloc if memory is super important for you
int flag = 1;//for the first copy
strTokHelper = strtok(str," ");
while(strTokHelper != NULL)
{
if(strcmp(strTokHelper,"aviad") != 0)//if they arent identical
{
if(flag == 1)//first time you need to copy and not concat
{
strcpy(output,strTokHelper);
flag = 0;//no more copying from now on we will concat
}
else
{
strcat(output,strTokHelper);//concating
}
strcat(output," ");//putting a space between each word
}
strTokHelper = strtok(NULL," ");//finding the next word..strTokHelper == NULL -> end of string
}
printf("%s\n",output);


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ronen333 
חבר מתאריך 20.2.03
6069 הודעות
   12:49   01.11.09   
אל הפורום  
  2. אחי  
בתגובה להודעה מספר 1
 
   ערכתי לאחרונה בתאריך 01.11.09 בשעה 12:57 בברכה, ronen333
 
לא רציתי פתרון, רציתי לדעת איפה הבעיה במה שעשיתי P=
מה גם שאני בכוונה עשיתי בלי הקצאת זכרון..

כשמשתמשים בהקצאת זכרון כשלא צריך המרצה שלי נוהג להלקות 40 מלקות לפחות


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   20:10   01.11.09   
אל הפורום  
  4. מרצה?  
בתגובה להודעה מספר 2
 


בברכה,
עידן


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ronen333 
חבר מתאריך 20.2.03
6069 הודעות
   14:57   02.11.09   
אל הפורום  
  7. אותו בן אדם  
בתגובה להודעה מספר 4
 
   שמלמד אותי C במכללה..


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ronen333 
חבר מתאריך 20.2.03
6069 הודעות
   12:59   01.11.09   
אל הפורום  
  3. גרר..שכחתי להמיר סוגריים מרובעים...  
בתגובה להודעה מספר 0
 
   בMAIN כן הגדרתי לו את גודל המערך-

char st1[14]="aviad b aviad";
char st2[6]="aviad";
puts(delete_all_string(st1,st2));


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   20:11   01.11.09   
אל הפורום  
  5. לא רואה ישורים ובלגאנים. תעלה כ-TXT  
בתגובה להודעה מספר 0
 


בברכה,
עידן


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ronen333 
חבר מתאריך 20.2.03
6069 הודעות
   14:41   02.11.09   
אל הפורום  
  6. Here  
בתגובה להודעה מספר 5
 
   https://rotter.name/User_files/nor/4aeed37b0f7cc8c9.txt


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   20:28   02.11.09   
אל הפורום  
  8. מה עושה בדיוק strstr הזו?  
בתגובה להודעה מספר 6
 
קצת סיבכת את העניין, האמת היא.
השיטה היא ממש פשוטה ודורשת שימוש בשני קאונטרים (2 לולאות מקוננת).
ברגע ש-==str2[j אז i++ ו-j++, אחרת, i=0 ו-j++ (כחלק מהאיטרציה).
אם לא מגיעים ל-0\ אז מאפסים את j וממשיכים (ואפשר להעלות קאונטר כל פעם שמוצאים דבר שכזה).
בשלב הזה אתה צריך שומר את הערכים שברצונך לחזור ועובר שוב על הטקסט וגוזר אותו כרצונך. (כל זה יעשה ב-(O(n במקום בסיבוכיות (O(nlogn.

עכשיו, אם רוצים גם לגלות כמה פעמים זה מופיע עם כפלויות, כלומר str1=aba ו-str2=ababa אז צריך עוד קאונטר שיבדוק במקביל j=0.
בכל מקרה, זו השיטה איטרטיבית לפתרון 2 (למקרה היותר קשה).
יותר חכם בעיניי אבל להשתמש בשיטה רקוריסיבית שתשווה תת מילה כל פעם ל-str הנתון (עם strcmp).
השאלה עד כמה אתה מחפש יעילות ואם בכלל אתה צריך את כל חלק 2 שמסבך מעט את העניין.

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


בברכה,
עידן


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ronen333 
חבר מתאריך 20.2.03
6069 הודעות
   23:17   02.11.09   
אל הפורום  
  9. strstr היא פונקציה סטנדרטית בSTRING.H  
בתגובה להודעה מספר 8
 
   ערכתי לאחרונה בתאריך 02.11.09 בשעה 23:20 בברכה, ronen333
 
הפרמטר הראשון שלה מקבל מערך תווים(מחרוזת), הפרמטר השני מקבל תת מחרוזת; הפונוקציה תחזיר מצביע לאיבר הראשון של התת מחרוזת במחרוזת (
דומה לindexof בC# רק שבמקום אינדקס הוא מחזיר מצביע).
אם הוא לא נמצא אז מחזיר NULL.

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

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


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   22:04   03.11.09   
אל הפורום  
  10. הבנתי. תשמע, יש כמה טעויות תכנתיות מסוכנות שיכולות  
בתגובה להודעה מספר 9
 
לגרום לזה.
לא חובה להקצות זכרון, אבל לבדוק strlen לא מבטיח שיש באמת \0 בסוף המילה וזה יכול לעשות שמח.

מחר אני אבדוק לך את זה מול קומפיילר, יהיה לי יותר קל להצביע מאין הבעיה.


בברכה,
עידן


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ronen333 
חבר מתאריך 20.2.03
6069 הודעות
   10:40   14.11.09   
אל הפורום  
  11. עידן? P= אני חושב שעבר אותו מחר ממזמן..  
בתגובה להודעה מספר 10
 
  


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   16:39   14.11.09   
אל הפורום  
  12. חחח ברח לי מהראש. תזכיר לי מה רצית שאכין?  
בתגובה להודעה מספר 11
 


בברכה,
עידן


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ronen333 
חבר מתאריך 20.2.03
6069 הודעות
   21:23   14.11.09   
אל הפורום  
  13. חחח HEADS UP  
בתגובה להודעה מספר 12
 
   https://rotter.name/nor/prog/15523.shtml#10


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד

תגובה מהירה  למכתב מספר: 
 
___________________________________________________________________

___________________________________________________________________
למנהלים:  נעל | תייק בארכיון | מחק | העבר לפורום אחר | מחק תגובות | עגן אשכול
       



© כל הזכויות שמורות ל-רוטר.נט בע"מ rotter.net