ABA


"עזרה עם מחרוזות ב C"
גירסת הדפסה        
קבוצות דיון פיתוח, תיכנות ובניית אתרים נושא #10234 מנהל    סגן המנהל    מפקח   Winner    צל"ש   מומחה  
אשכול מספר 10234
ShocKi  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 19.3.02
20171 הודעות, 10 פידבק, 17 נקודות
   20:40   17.01.11   
אל הפורום  
  עזרה עם מחרוזות ב C  
 
   אני תקוע בשלב מסוים בתרגיל שנתנו לי..
אני צריך לחפש תו... אם הוא מופיע במחרוזת אז למחוק אותו משם ולצמצם את המקום הריק שנוצר.... אני מצרף את הקטע הרלוונטי שזה אחרי כל הבדיקות שהמחרוזות לא ריקות ושהמחרוזת בהכרח גדולה מ1 (מונע מצב שהמחרוזת למעשה שווה לתו ואז הבדיקה פשוטה יותר וכו')
כתבתי את הקטע הנ"ל..
string זו המחרוזת המקורית.
string1 זו המחרוזת החדשה שאני אמור לקבל אחרי השינוי

for(i=0;i<(strlen(string)-1);i++)
{
if (string!=c)
strcat(string1,string);
if (string==c)
{
counter++;
if (i+1<=strlen(string))
strcat(string1,string);
i++;
}

מסיבה כלשהי בשום מקרה הוא לא מצליח לעשות את השורה עם strcat.
זו השגיאה:
http://gyazo.com/1c9215c49ec92ea363f95df178d4cbb2.png
אני אשמח לעזרה כי אני לא מבין מה לא טוב כאן.


קאש-באק ישראלי: https://www.cashback.co.il/?uref=33330
קאשבק לAsos ואמזון דרך Ebates: https://goo.gl/MX87Y7 - מקבלים 10$ לאחר שימוש ראשון.


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

  האשכול     מחבר     תאריך כתיבה     מספר  
  לא בטוח למה מימשת את זה ככה... ldan192  17.01.11 20:47 1
     מכתב ShocKi  17.01.11 21:00 2
         קודם כל בכיף ldan192  17.01.11 21:07 3
             אבל אני בבעיה.. ShocKi  17.01.11 21:10 4
                 אין סיבה... ldan192  17.01.11 21:18 5
  המימוש שלך לא ברור D-KinG 17.01.11 22:33 6
  הסבר לגבי המימוש ShocKi  17.01.11 22:43 7
     מכתב D-KinG 17.01.11 23:24 8
         תודה עזרת לי מאוד.. ShocKi  17.01.11 23:34 9
             תעתיק את הקוד החדש ואני אבדוק D-KinG 17.01.11 23:36 10
                 הנה התוכנית.. ShocKi  17.01.11 23:48 11
                     זה סתם יותר מסובך D-KinG 17.01.11 23:51 12
                         תסתכל על העריכה ShocKi  17.01.11 23:52 13
                             ב-main D-KinG 18.01.11 00:02 14
                                 שיניתי... מצאתי עוד טעות ShocKi  18.01.11 00:56 15
                                 טוב ניסיתי להפוך את זה לרקורסיה ואני פשוט לא מצליח ShocKi  20.01.11 20:11 16
                                     אתה יכול להוסיף מספרים שלמים למצביע D-KinG 21.01.11 14:29 17
                                         זה ברור לי.. אבל.. ShocKi  21.01.11 22:58 20
                                     הנה פתרון שכתבתי VeNom  21.01.11 15:24 18
                                         תודה אחי.. אבל אני לא מבין מה כתבת.. ShocKi  21.01.11 22:55 19
                                             בגדול VeNom  21.01.11 23:51 21
                                                 אבל איך מתבצעת ההשוואה? ShocKi  22.01.11 00:01 22
                                                     אממ משהו כזה VeNom  22.01.11 11:28 23
                                                         תודה :) ShocKi  22.01.11 14:31 24
  שאלה נוספת על עניין אחר במחרוזות ShocKi  22.01.11 14:35 25

       
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   20:47   17.01.11   
אל הפורום  
  1. לא בטוח למה מימשת את זה ככה...  
בתגובה להודעה מספר 0
 
ערכתי לאחרונה בתאריך 17.01.11 בשעה 20:51 בברכה, ldan192
 
אבל אני הייתי מממש בצורה הבאה:

char* delChar(char *inStr, char inCh) {
char *retStr = malloc(sizeof(char)*(strlen(inStr + 1));
int jump = 0, length = strlen(inStr);
for (int i=0; i<=length; ++i) {
if (inStr[i] == inCh) {
++jump;
continue;
}
retStr[i-jump] = inStr[i];
}
return retStr;
}

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


בברכה,
עידן


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ShocKi  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 19.3.02
20171 הודעות, 10 פידבק, 17 נקודות
   21:00   17.01.11   
אל הפורום  
  2. מכתב  
בתגובה להודעה מספר 1
 
   קודם כל תודה.

אני לא צריך את כל ההקצאת זכרון וכו'.. כפי שציינתי השורות שהבאתי הן קטע מהתוכנית...
אני אשמח להסבר לגבי מה שעשית כי אני לא מבין מה עשית שם.. למה i-jump ??


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


קאש-באק ישראלי: https://www.cashback.co.il/?uref=33330
קאשבק לAsos ואמזון דרך Ebates: https://goo.gl/MX87Y7 - מקבלים 10$ לאחר שימוש ראשון.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   21:07   17.01.11   
אל הפורום  
  3. קודם כל בכיף  
בתגובה להודעה מספר 2
 
ולפי מה שאני חושב, אם תחליף את המשתנה שהקצתי דינמית בזה שבקלט - זה יעבוד.

הרעיון הוא פשוט ליצור שמורה שכזו: "עד כה קפצתי על jump תווים מיותרים".
עבור i,jump=0 אז במחרוזת אין אף תו מיותר.
ככל שמתקדמים, jump עולה ו-jump-i "נשאר במקום" עד שמגיעים לסוף המחרוזת.


* כמובן שאם אתה לא מקצה מחדש אלא ממחזר - אתה צריך את שאר המחרוזת (עד length) לאפס, כי יש "זבל" שקפצת עליו.


בברכה,
עידן


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ShocKi  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 19.3.02
20171 הודעות, 10 פידבק, 17 נקודות
   21:10   17.01.11   
אל הפורום  
  4. אבל אני בבעיה..  
בתגובה להודעה מספר 3
 
   אני יכול לספור את כל המופעים של תו במחרוזת... זה לא הסיפור כאן...
הבעיה שלי זה עם יצירת המחרוזת המתבקשת... אני מנסה לעשות את זה עם strcat וזה לא עובד.. וגם התוכנית שלך לא עושה את זה.. ה jump אצלך עובד אבל אין יצירה של מחרוזת חדשה/תיקון המחרוזת הקיימת.


קאש-באק ישראלי: https://www.cashback.co.il/?uref=33330
קאשבק לAsos ואמזון דרך Ebates: https://goo.gl/MX87Y7 - מקבלים 10$ לאחר שימוש ראשון.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   21:18   17.01.11   
אל הפורום  
  5. אין סיבה...  
בתגובה להודעה מספר 4
 

char* delChar(char *inStr, char inCh) {
int jump = 0, length = strlen(inStr);
for (int i=0; i<=length; ++i) {
if (inStr == inCh) {
++jump;
continue;
}
inStr = inStr;
}
for (int i=length-jump+1; i<=length; ++i) inStr='\0';
return inStr;
}

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


בברכה,
עידן


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
D-KinG
חבר מתאריך 8.6.02
3490 הודעות, דרג אמינות חבר זה
   22:33   17.01.11   
אל הפורום  
  6. המימוש שלך לא ברור  
בתגובה להודעה מספר 0
 
   תנסה להסביר בדיוק מה ניסית לעשות כאן
בכל מקרה כמה דברים שבולטים לעין:
אתה לא יכול להשוות את string עם c, הם לא מאותו הסוג בכלל, נראה לי שהתכוונת לstring מרובעיים i
strlen מחזירה לך את אורך המחרוזת בלי ה-NULL בסוף, אז אין צורך ב 1-
לא ברור למה אתה משתמש פה ב-strcat, אבל שוב המימוש לא הכי ברור
כמו שזה נראה אתה מעתיק בלולאה אינסופית לתוך string1 את string
כי ההשוואה הראשונה כל הזמן תהיה אמת, ואין לך מספיק מקום ב-string1 אז הוא חורג בזיכרון


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ShocKi  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 19.3.02
20171 הודעות, 10 פידבק, 17 נקודות
   22:43   17.01.11   
אל הפורום  
  7. הסבר לגבי המימוש  
בתגובה להודעה מספר 0
 
   זו הפונקציה המלאה


int removeCharacter(char *string, char *letter)
{

int i,counter=0;
char string1={0};
char c=*letter;
if (strcmp(string,"c")==0)
return 1;
else
{
for(i=0;i<(strlen(string)-1);i++)
{
if (string!=c)
strcat(string1,string);
if (string==c)
{
counter++;

}

}
}
return counter;
}

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

השיטה שלי הייתה כזאת.. תחילה אני בודק אם המחרוזת למעשה היא התו הבודד letter עצמו.. אם כן אני אומר שהמשתנה הסופר שלי הוא 1 ואני בעצם צריך להדפיס מחרוזת ריקה כי למעשה מחקתי את התו היחיד שיש בה... אם לא אז, אני רץ בלולאה על המחרוזת המקורית.. כל עוד לא הגעתי לסוף המחרוזת. בכל סיבוב אני שואל אם התו במחרוזת במקום i שווה ל c... אם לא אני משרשר את התו שנמצא במקום i למחרוזת החדשה אחרת זה אומר שמצאתי תו שאני צריך למחוק.. במקרה הזה אני מגדיל את המשתנה שסופר מופעים ב 1.

זו הייתה אמורה להיות השיטה... בגלל שזה לא הלך לי התחלתי לעשות כל מיני שינויים...
לא הצלחתי לעשות השוואה בין קוד אסקי של המחרוזת במקום i לקוד אסקי של letter.. לכן הגדרתי משתנה חדש מסוג *char ואז ההשוואה הייתה בסדר.. אבל אז משהו אחר נדפק..

זה אמור להיות קוד פשוט אבל הסתבכתי איתו ממש.


קאש-באק ישראלי: https://www.cashback.co.il/?uref=33330
קאשבק לAsos ואמזון דרך Ebates: https://goo.gl/MX87Y7 - מקבלים 10$ לאחר שימוש ראשון.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
D-KinG
חבר מתאריך 8.6.02
3490 הודעות, דרג אמינות חבר זה
   23:24   17.01.11   
אל הפורום  
  8. מכתב  
בתגובה להודעה מספר 7
 
   הבדיקה הראשונית שלך מיותרת
ובכל מקרה אתה שולח ל-strcmp את המחרוזת המקורית ומחרוזת שמכילה רק את התו c... לא את המשתנה שאתה יצרת שורה קודם, אתה צריך לשלוח את c לבד בלי הגרשיים, וגם בשביל שזה יעבוד, לא ציינת אם letter הוא מחרוזת שמסתיימת עם NULL או רק התו, כי אם זה רק התו זה יעשה לך בעיות כי אתה לא שולח פה לפונ' מחרוזת.
לגבי הלולאה, השימוש ב-strcat לא ברור
strcat משרשרת לסוף המחרוזת השמאלית את המחרוזת הימנית, במקרה שלך למשל אם בפעם הראשונה של הלולאה התנאי מתקיים אז תעתיק את כל המחרוזת string לתוך string1, בפעם השנייה אם התנאי מתקיים תעתיק שוב את string לסוף המחרוזת string1, ואז תקבל פעמיים את string בתוך string1, וכו'
מה שאתה צריך לעשות זה משהו כזה

int j=0;
for (i=0; i<strlen(string); i++)
{
if (string(i)!=*letter)
{
string1(j)=string(i);
j++;
}
else
counter++
}
string1(j)='\0';

j יגיד לנו מה האינדקס הבא שנכניס אליו ב-string1
בכל פעם שנעתיק לשם אז נקדם אותו, בסוף נשים NULL
השתמשתי פה בסוגריים רגילות במקום מרובעיים כי יש עם זה בעיות
ותשים לב שהלולאה רץ עד strlen, לא צריך לחסר 1


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ShocKi  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 19.3.02
20171 הודעות, 10 פידבק, 17 נקודות
   23:34   17.01.11   
אל הפורום  
  9. תודה עזרת לי מאוד..  
בתגובה להודעה מספר 8
 
   אני חשבתי שהשרשור... ישרשר לי תו ולא את כל מה שנשאר מהמחרוזת.. זו הטעות שלי...

אני אשמח לעזרה נוספת.. התוכנית עובדת אבל הוא מצביע לי על שגיאה בסוגר שמסיים את התוכנית.. הוא אומר שהמשתנה letter הושחט?
http://gyazo.com/e677c0d324e273c1f0349d6a39195216.png


קאש-באק ישראלי: https://www.cashback.co.il/?uref=33330
קאשבק לAsos ואמזון דרך Ebates: https://goo.gl/MX87Y7 - מקבלים 10$ לאחר שימוש ראשון.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
D-KinG
חבר מתאריך 8.6.02
3490 הודעות, דרג אמינות חבר זה
   23:36   17.01.11   
אל הפורום  
  10. תעתיק את הקוד החדש ואני אבדוק  
בתגובה להודעה מספר 9
 
  


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ShocKi  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 19.3.02
20171 הודעות, 10 פידבק, 17 נקודות
   23:48   17.01.11   
אל הפורום  
  11. הנה התוכנית..  
בתגובה להודעה מספר 10
 
   ערכתי לאחרונה בתאריך 17.01.11 בשעה 23:52 בברכה, ShocKi
 
שיניתי קצת את הפונקציה.. העפתי את string1... כי אני רוצה שהשינוי יהיה על המחרוזת המקורית

#include <stdio.h>
#include <string.h>
#define length 3
void scan_parameters (char *string,char *letter);
int removeCharacter(char *string, char letter);
int main()
{
char string={0},letter;
int result;
scan_parameters(string,letter);
removeCharacter(string,letter);
printf("\n\n");
printf("The string after ruuning program is:");
puts(string);
getch();
return 0;
}
void scan_parameters (char *string,char *letter)
{
//scan parameters
do
{
printf("Enter text up to %d letters: ",length);
flushall();
gets(string);
if (strlen(string)>length)
printf("\nInput is too big, please follow guidelines\n");
}
while (strlen(string)>length);
do
{
printf("\nEnter charcter to remove: ");
flushall();
gets(letter);
if (strlen(letter)>1)
printf("\nWe asked for charcter, charcter is a 1 size string\n");
}
while (strlen(letter)>1);
//printing parameters
puts(string);
printf("letter to remove ");
puts(letter);

}


int removeCharacter(char *string, char *letter)
{
int j=0,i,counter=0;
for (i=0; i<strlen(string); i++)
{
if (string!=*letter)
{
string=string;
j++;
}
else
counter++;
}

string='\0';
printf("apperance of letter %c in the string is %d",*letter,counter);
return counter;
}



התוכנית עובדת... אבל יש לי שגיאה בסוף התוכנית.. הוא מצביע על הסוגר של ה main ונותן את השגיאה שהראתי.


קאש-באק ישראלי: https://www.cashback.co.il/?uref=33330
קאשבק לAsos ואמזון דרך Ebates: https://goo.gl/MX87Y7 - מקבלים 10$ לאחר שימוש ראשון.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
D-KinG
חבר מתאריך 8.6.02
3490 הודעות, דרג אמינות חבר זה
   23:51   17.01.11   
אל הפורום  
  12. זה סתם יותר מסובך  
בתגובה להודעה מספר 11
 
   ויש פונ' שתעתיק לך את המחרוזת
strcpy(string, string1)


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ShocKi  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 19.3.02
20171 הודעות, 10 פידבק, 17 נקודות
   23:52   17.01.11   
אל הפורום  
  13. תסתכל על העריכה  
בתגובה להודעה מספר 12
 
  


קאש-באק ישראלי: https://www.cashback.co.il/?uref=33330
קאשבק לAsos ואמזון דרך Ebates: https://goo.gl/MX87Y7 - מקבלים 10$ לאחר שימוש ראשון.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
D-KinG
חבר מתאריך 8.6.02
3490 הודעות, דרג אמינות חבר זה
   00:02   18.01.11   
אל הפורום  
  14. ב-main  
בתגובה להודעה מספר 13
 
   letter צריך להיות בגודל 2 בשביל ה-NULL


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ShocKi  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 19.3.02
20171 הודעות, 10 פידבק, 17 נקודות
   00:56   18.01.11   
אל הפורום  
  15. שיניתי... מצאתי עוד טעות  
בתגובה להודעה מספר 14
 
   ערכתי לאחרונה בתאריך 18.01.11 בשעה 01:09 בברכה, ShocKi
 
הגדרתי את string באורך 3.. והכנסתי גם 3 תוים ל string אז לא היה מקום ל null גם בסטרינג עצמו.


תודה אחינו..

עכשיו אני צריך להפוך את זה לתוכנית רקורסיבית.. נראה איך זה ילך לי


קאש-באק ישראלי: https://www.cashback.co.il/?uref=33330
קאשבק לAsos ואמזון דרך Ebates: https://goo.gl/MX87Y7 - מקבלים 10$ לאחר שימוש ראשון.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ShocKi  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 19.3.02
20171 הודעות, 10 פידבק, 17 נקודות
   20:11   20.01.11   
אל הפורום  
  16. טוב ניסיתי להפוך את זה לרקורסיה ואני פשוט לא מצליח  
בתגובה להודעה מספר 14
 
   איך אני יכול להתעסק עם מחרוזת בלי שיש לי איזשהו אינדקס שמצביע על המקום בתוך המחרוזת?


קאש-באק ישראלי: https://www.cashback.co.il/?uref=33330
קאשבק לAsos ואמזון דרך Ebates: https://goo.gl/MX87Y7 - מקבלים 10$ לאחר שימוש ראשון.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
D-KinG
חבר מתאריך 8.6.02
3490 הודעות, דרג אמינות חבר זה
   14:29   21.01.11   
אל הפורום  
  17. אתה יכול להוסיף מספרים שלמים למצביע  
בתגובה להודעה מספר 16
 
   למשל אם הסטרינג שלך הוא nir ותשלח בפעם הבאה את string+1
הסטרינג יהיה ir, אם תשלח string+2 יהיה רק r, וכו'


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ShocKi  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 19.3.02
20171 הודעות, 10 פידבק, 17 נקודות
   22:58   21.01.11   
אל הפורום  
  20. זה ברור לי.. אבל..  
בתגובה להודעה מספר 17
 
   איך אתה תשאל אם האיברים בתוך ה string שווים לתו המבוקש שאותו אני אמור להסיר?


קאש-באק ישראלי: https://www.cashback.co.il/?uref=33330
קאשבק לAsos ואמזון דרך Ebates: https://goo.gl/MX87Y7 - מקבלים 10$ לאחר שימוש ראשון.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
VeNom  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 7.6.02
7922 הודעות, 1 פידבק, 2 נקודות
   15:24   21.01.11   
אל הפורום  
  18. הנה פתרון שכתבתי  
בתגובה להודעה מספר 16
 
  

#include <stdio.h>
#include <string.h>

void recRemove(char* str, char rem);

void replace(char* str,char rem)
{
int i = 0;
while(str[i] != '\0')
{
str[i] = str[i+1];
i++;
}
str[i] = '\0';
recRemove(str,rem);//for duplicates
}

void recRemove(char* str, char rem)
{
if(*str == '\0')
return;
else if(*str == rem)
replace(str,rem);
else
recRemove(str + 1,rem);
}

int main()
{
int SIZE = 40;
char* input = (char*)malloc(sizeof(int) * SIZE);
char rem;
printf("insert string\n");
fgets(input,SIZE,stdin);
printf("insert char to remove\n");
scanf("%c",&rem);
recRemove(input,rem);
printf("output %s",input);
free(input);
return 1;
}


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


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ShocKi  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 19.3.02
20171 הודעות, 10 פידבק, 17 נקודות
   22:55   21.01.11   
אל הפורום  
  19. תודה אחי.. אבל אני לא מבין מה כתבת..  
בתגובה להודעה מספר 18
 
   השתמשת כאן בפקודות שאני לא מכיר.. fgets?

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


קאש-באק ישראלי: https://www.cashback.co.il/?uref=33330
קאשבק לAsos ואמזון דרך Ebates: https://goo.gl/MX87Y7 - מקבלים 10$ לאחר שימוש ראשון.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
VeNom  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 7.6.02
7922 הודעות, 1 פידבק, 2 נקודות
   23:51   21.01.11   
אל הפורום  
  21. בגדול  
בתגובה להודעה מספר 19
 
   fgets זה כמו scanf..אז תחליף את זה בscanf לתוך מחרוזת.
malloc = הקצאה דינמית..אם לא למדת אז תמחק את זה ותקצה את המערך עם גודל קבוע..אני הקצאתי עם גודל של 40..סתם שרירותי.
free זה פוקנציה שמשחררת זכרון דינמי שהוקצה..אם אתה מבטל את ה malloc תבטל גם אותו.
חוץ מזה printf זה הדפסה למסך..ובמיין יש קריאה לפונקציה הרקורסיבית שעושה את הפעולה.
עכשיו אם אתה רגיל לראות void main אז תמחק את ה return 1 במיין..זה סתם להגיד שהתוכנית הסתיימה בהצלחה..סטדנרט בחלק מהקומפיילרים ולכן כתבתי ככה..
בפונקציה אני בודק 3 מצבים..מצב ראשון האם הגעתי לסוף מחרוזת..אם כן צא מהפונקציה ע"י return..אחרת אני בודק האם בתחילת המחרוזת שלי יש את התו המבוקש..אם כן אני מבצע הזזה של כל המחרוזת שמאלה בתו אחד(כלומר דורס את האות הספציפית) וקורא שוב לפוקנציה הרקורסיבית עם המערך החדש.
אם לא אז יש תו שהוא לא סוף מחרוזת ולא התו המבוקש ולכן אני מקדם את המחרוזת ב 1..כלומר התו הזה לא מעניין אותי ואני ממשיך הלאה.
זה הכל..זה די פשוט להבנה..אם לא הבנת את ה *str אתה יכול להחליף את זה ב

str[0]
זה שקול לגמרי..
אם עדיין לא הבנת אז תמשיך לשאול..


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ShocKi  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 19.3.02
20171 הודעות, 10 פידבק, 17 נקודות
   00:01   22.01.11   
אל הפורום  
  22. אבל איך מתבצעת ההשוואה?  
בתגובה להודעה מספר 21
 
   הרי אתה צריך בכל פעם לבודד תו מהמחרוזת ולשאול האם הוא שווה לתו המבוקש.. אם כן אז לדרוס את המחרוזת...
איך אתה עושה את ההשוואה שם..? זה לא מסתדר לי..


קאש-באק ישראלי: https://www.cashback.co.il/?uref=33330
קאשבק לAsos ואמזון דרך Ebates: https://goo.gl/MX87Y7 - מקבלים 10$ לאחר שימוש ראשון.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
VeNom  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 7.6.02
7922 הודעות, 1 פידבק, 2 נקודות
   11:28   22.01.11   
אל הפורום  
  23. אממ משהו כזה  
בתגובה להודעה מספר 22
 
   בהינתן המחרוזת
"rotter"
והתו t
מה שהוא עושה זה מתחיל מ "rotter" בקריאה הראשונה..התו הראשון אינו סוף מחרוזת ואינו t ולכן הוא מצמצם את המחרוזת ל otter ומבצע עוד קריאה..
הקריאה עושה אותו דבר וגם כאן התו הראשון אינו סוף מחרוזת ולא t ולכן יש קריאה שלישית לפונקציה עם המחרוזת tter.
בקריאה הזאת התו הראשון אינו סוף מחרוזת אבל הוא כאן t ולכן הולכים לפונקציית עזרת שפשוט עושה הזזה של המחרוזת שמאלה כלומר אם היה tter נשארנו עם ter.ובסוף היא עושה קריאה נוספת לפונקציה הרקורסיבית.
גם כאן התו הראשון אינו סוף מחרוזת אבל הוא כן t ולכן נלך שוב לפונק' עזר ושם מ ter נעבור ל er ונבצע שוב קריאה.
בקריאה הזאת התו הראשון אינו סוף מחרוזת ולא t ולכן נבצע קריאה עם המחרוזת שנשארה לנו הלא היא r.
בקריאה הזו זה גם לא תו של סוף מחרוזת וגם לא t ולכן נבצע קריאה עם תו של סוף מחרוזת..לכל מחרוזת יש תו סופי \0 כלומר "rotter" זה בעצם
"rotter\0" עכשיו הוא יקבל את התו הזה וידע לחזור מהפונקציה..
זה בקצרה מה קורה בערך..


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ShocKi  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 19.3.02
20171 הודעות, 10 פידבק, 17 נקודות
   14:31   22.01.11   
אל הפורום  
  24. תודה :)  
בתגובה להודעה מספר 23
 
  


קאש-באק ישראלי: https://www.cashback.co.il/?uref=33330
קאשבק לAsos ואמזון דרך Ebates: https://goo.gl/MX87Y7 - מקבלים 10$ לאחר שימוש ראשון.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ShocKi  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 19.3.02
20171 הודעות, 10 פידבק, 17 נקודות
   14:35   22.01.11   
אל הפורום  
  25. שאלה נוספת על עניין אחר במחרוזות  
בתגובה להודעה מספר 0
 
   ערכתי לאחרונה בתאריך 22.01.11 בשעה 15:14 בברכה, ShocKi
 

pointer1=strchr(newstring,' ');
pointer2=strchr(newstring,',');

http://gyazo.com/ea4fdace5a01c47ac6c0f377f18f980c.png

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


אני לא מצליח להבין מה הבעיה...?


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


קאש-באק ישראלי: https://www.cashback.co.il/?uref=33330
קאשבק לAsos ואמזון דרך Ebates: https://goo.gl/MX87Y7 - מקבלים 10$ לאחר שימוש ראשון.


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

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

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



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