ABA


"איך מתמודדים עם RunTime Error בקלט ב C של מחרוזת?"
גירסת הדפסה        
קבוצות דיון פיתוח, תיכנות ובניית אתרים נושא #10127 מנהל    סגן המנהל    מפקח   Winner    צל"ש   מומחה  
אשכול מספר 10127
Yariv-H לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 24.3.02
5856 הודעות, 1 פידבק
   22:31   31.10.10   
אל הפורום  
  איך מתמודדים עם RunTime Error בקלט ב C של מחרוזת?  
 
   ראיתי שהאפשרות להגדיר סטרינג באורך המקסימלי הוא 256 אם אני לא טועה.

וחייבים להגדיר את המערך של ב char.

מה קורה אם מישהוא מכניס טקסט שהוא ארוך מ 256?

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

(אני לא מאמין שהפתרון זה להאמין שזה לא יקרה....)

תודה!



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

  האשכול     מחבר     תאריך כתיבה     מספר  
  תשובה Net_Boy  31.10.10 23:50 1
     אוקי סבבה אבל ברמת העקרון malloc Yariv-H 01.11.10 08:26 3
         מישהו? Yariv-H 02.11.10 00:02 5
             שים את הקוד המלא עם סוגריים מרובעים VeNom  02.11.10 13:08 6
                 .. Yariv-H 03.11.10 21:17 7
  תממש מערך דינמי. Zippo  01.11.10 07:37 2
     גם רעיון =-] תודה Yariv-H 01.11.10 08:27 4

       
Net_Boy  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 1.4.02
17151 הודעות, 1 פידבק
   23:50   31.10.10   
אל הפורום  
  1. תשובה  
בתגובה להודעה מספר 0
 
   אתה טועה, 256 תוים זה ממש לא המקסימום שאפשר להגדיר בו מחרוזת.
הגודל המקסימלי הוא כגודל המקום הפנוי ב STACK וזה משתנה בהתאם למערכת ההפעלה.

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

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

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

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


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Yariv-H לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 24.3.02
5856 הודעות, 1 פידבק
   08:26   01.11.10   
אל הפורום  
  3. אוקי סבבה אבל ברמת העקרון malloc  
בתגובה להודעה מספר 1
 
   אוקי הבנתי אני מכיר את ה maclloc .

דיברו איתנו על זה , תודה רבה!
ואם כבר .. יש לי משהוא מוזר שאני לא מבין למה התוכנית לא נופלת לי במצב הנתון הבא:


void main ()
{
int Arr;
int i,j;
Arr=1;
Arr=2;
Arr=3;
Arr=4;
Arr=5;

for (i=0;i<2;i++)
{
for (j=0;j<2;j++)
{
printf("%d ", Arr);
}

}
}


הפלט של הקוד הזה יהיה 1 2 3 4 5

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

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

רוב הפעמים הפלט שיצא לי הוא 1 2 3 4 והמספר האחרון רוב הפעמים ה ה5.
לא בכולם.

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

תודה רבה!@



                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Yariv-H לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 24.3.02
5856 הודעות, 1 פידבק
   00:02   02.11.10   
אל הפורום  
  5. מישהו?  
בתגובה להודעה מספר 3
 
  



                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
VeNom  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 7.6.02
7922 הודעות, 1 פידבק
   13:08   02.11.10   
אל הפורום  
  6. שים את הקוד המלא עם סוגריים מרובעים  
בתגובה להודעה מספר 5
 
   כדי שנראה..יש לך בצד ימין "המרת סוגרים מרובעים"..


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Yariv-H לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 24.3.02
5856 הודעות, 1 פידבק
   21:17   03.11.10   
אל הפורום  
  7. ..  
בתגובה להודעה מספר 6
 
  

void main ()
{
int Arr;
int i,j;
Arr[0][1]=1;
Arr[0][2]=2;
Arr[0][3]=3;
Arr[0][4]=4;
Arr[0][5]=5;

for (i=0;i<2;i )
{
for (j=0;j<2;j )
{
printf("%d ", Arr);
}

}
}
]/code[



                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Zippo 
חבר מתאריך 26.5.02
7921 הודעות
   07:37   01.11.10   
אל הפורום  
  2. תממש מערך דינמי.  
בתגובה להודעה מספר 0
 
תקלוט תו-תו, וכאשר נגמר המקום, אתה מקצה מערך כפול בגודלו, מעתיק את מה שקלטת עד עכשיו, משחרר את המערך הישן, וממשיך לקלוט.

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


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Yariv-H לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 24.3.02
5856 הודעות, 1 פידבק
   08:27   01.11.10   
אל הפורום  
  4. גם רעיון =-] תודה  
בתגובה להודעה מספר 2
 
  



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

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

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



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