ABA


"עזרה באיתור שגיאה מוזרה בקוד"
גירסת הדפסה        
קבוצות דיון פיתוח, תיכנות ובניית אתרים נושא #15620 מנהל    סגן המנהל    מפקח   Winner    צל"ש   מומחה  
אשכול מספר 15620
spidey1  
חבר מתאריך 1.7.02
25536 הודעות
   01:49   19.12.09   
אל הפורום  
  עזרה באיתור שגיאה מוזרה בקוד  
 
   בגדול מה שהתוכנית אמורה לעשות זה לבדוק אם המחרוזת השניה מוכלה במחרוזת הראשונה, התוכנית רצה ועובדת, אבל בסוף התוכנית אני מקבל את השגיאה הבאה:

זה הקוד, אם זה עוזר למישהו:


#include <iostream>
using namespace std;
#define SIZE1 7
#define SIZE2 4

int checks (char first, char second)
{
int j=0, i, counter=0;
for(i=0; i<SIZE1; i++)
{
if(first==second)
{
counter++;
j++;
if(counter+1==SIZE2)
{
return 0;
}
}
else
{
counter=0;
j=0;
}

}
return 1;
}

void main()

{
char first, second;
int answer;
cout<<"please enter the first string:\n";

cin>>first;
first='\0';
cout<<first<<"\n";
cout<<"please enter the second string:\n";

cin>>second;
second='\0';
cout<<second<<"\n";
answer=checks(first, second);
if (answer!=1)
cout<<"the first string contain the second string\n";
else
cout<<"the first string doesnt contains the second string\n";
}

תודה מראש לעוזרים!
מעריך את זה!

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


Tears Will Get You Sympathy,
Sweat Will Get You Results!


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

  האשכול     מחבר     תאריך כתיבה     מספר  
  אני אמנם קצת שיכור אבל השגיאה שלך די בולטת DLN 19.12.09 04:37 1
     קודם כל תודה, שנית, המטרה היא לנסות ''להתקיל'' את התוכנה spidey1   19.12.09 13:07 4
         עם CIN? לא מכיר דרך להגביל את הקלט DLN 19.12.09 14:14 5
  דבר ראשון פעם הבאה תלחץ על ''המרת סוגריים מרובעים'' Sn00py  19.12.09 11:00 2
     קודם כל המון תודה לשניכם! שנית spidey1   19.12.09 13:05 3
         זה היגיון חשוב מה שעשית אבל זה לא מונע OVERFLOW DLN 19.12.09 14:16 6
         פתרון די פשוט Sn00py  19.12.09 15:29 7
             אסור לנו להשתמש בCIN.GET או משהו כזה spidey1   19.12.09 23:54 8
  המון תודה לכולם! מעריך את זה מאוד! spidey1   19.12.09 23:55 9

       
DLN
חבר מתאריך 20.4.07
15884 הודעות
   04:37   19.12.09   
אל הפורום  
  1. אני אמנם קצת שיכור אבל השגיאה שלך די בולטת  
בתגובה להודעה מספר 0
 
   שאתה מגדיר char first, אתה מגדיר כולה בית אחד בזכרון בשבילו.
מן הסתם שיהיה לך OVERFLOW עצבני
אתה צריך להגדיר מערך של CHARים גדול מספיק, או מצביע לCHAR שמאולקץ לגודל מתאים


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
spidey1  
חבר מתאריך 1.7.02
25536 הודעות
   13:07   19.12.09   
אל הפורום  
  4. קודם כל תודה, שנית, המטרה היא לנסות ''להתקיל'' את התוכנה  
בתגובה להודעה מספר 1
 
   ז"א גם אם הגדרתי מחרוזת של 3 תווים, אני בכוונה רוצה לנסות להזין 7 תווים כדי לנסות "להתקיל" את התוכנה, השאלה היא איך אני דואג לכך שאם יזינו לי 7 תווים בתוכנה שבניתי, היא לא תיכנס לOVERFLLOW


Tears Will Get You Sympathy,
Sweat Will Get You Results!


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
DLN
חבר מתאריך 20.4.07
15884 הודעות
   14:14   19.12.09   
אל הפורום  
  5. עם CIN? לא מכיר דרך להגביל את הקלט  
בתגובה להודעה מספר 4
 
   אבל חיפוש בגוגל מצא את זה

#include <iostream>
#include <string>
#include <iomanip>

int main()
{
char temp[16];
std::cout << "Enter some text\n";

std::cin >> std::setw(16) >> temp;

// or using std::string

std::string str;
std::cin >> str;


return 0;
}


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Sn00py 
חבר מתאריך 1.8.02
2954 הודעות
   11:00   19.12.09   
אל הפורום  
  2. דבר ראשון פעם הבאה תלחץ על ''המרת סוגריים מרובעים''  
בתגובה להודעה מספר 0
 
   בצד ימין - כי זה נראה באמת כאילו התגובה של אלון נכונה(אבל פשוט רוטר העיף לך את הסוגריים המרובעים).

בכל מקרה - יש לך כמה בעיות, הראשונה שבהן היא השימוש
שים לב:


#define SIZE1 7
#define SIZE2 4

אתה מגביל את אורך המחרוזת הראשונה שלך ל7 תווים ואת השניה ל-4...
ואתה מכניס מחרוזות ממש ארוכות...
אם תנסה להכניס מחרוזת נניח של 4 תווים בקלט הראשון ומחרוזת של 2 תווים בקלט השני(סתם בחרתי מספרים קטנים יותר - כל אורך שקטן מהאורך המוגדר יעבוד) אז התוכנית לא תעוף - אבל בכל מקרה האלגוריתם שלך לא נכון

עוד שגיאה שכדאי שתחשוב עליה,


first[SIZE1]='\0';
second[SIZE2]='\0';

תקרא קצת אם אתה בכלל צריך את זה עם cin,

ויותר מזה - מה באמת קורה שאתה מגדיר מערך באורך 7, האם באמת יש לך מקומות 1,2,3,4,5,6,7? התשובה היא לא - אתה מתחיל ממקום 0 עד מקום 6, כך שאתה נגש במערכים לתא במקום -הגודל שלהם-, אתה יוצא מהמערך. תמיד תזכור שהגבולות שלך הם מ-0 ולא מ-1.

בהצלחה

\x6C\x65\x65\x74\x68\x61\x78\x30
\x72\x3A\x2D\x29
tresp4sser


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
spidey1  
חבר מתאריך 1.7.02
25536 הודעות
   13:05   19.12.09   
אל הפורום  
  3. קודם כל המון תודה לשניכם! שנית  
בתגובה להודעה מספר 2
 
   בכוונה הזנתי יותר פרמטרים ממה שהמחרוזת יכולה לקלוט,
המטרה היא למנוע את הOVERFLOW כי כשהבודק יבדוק את התוכנה שלי... אני מניח שהוא כן יחפש "פירצות", והמטרה היא שלא יהיו בכלל...
ז"א שגם אם הוגדר איפשהו שהמחרוזת תיהיה 7 מקומות, הוא ינסה להזין 10 רק בשביל לראות אם הצלחתי למנוע את הOVERFLLOW... השאלה היא, אם יש דרך לעשות את זה מבלי לתת לו להכניס את המשפט\מילה בלולאת FOR ומבלי להשתמש בפונקצ'(מותר לנו להשתמש רק בSTRLEN).

בגדול, שיפצתי קצת את הפונקציה וניסיתי לעשות את זה:


cin>>second;
second[SIZE2-1]='\0';
lng=strlen(second);
cout<<second<<"\n";

ז"א שהמחרוזת קודם תקבל \0 בסופה(כדי למנוע חרגיה, נניח שהזנתי 15 תוים והיא יכולה לקבל רק 3 אז היא תעצור במקום מס' 3)
ואחרי זה בדקתי את הגודל של המחרוזת(זה בהמשך כדי להשוות את כמות הפעמים שמחרוזת שתיים נימצאת במחרוזת אחד).
אני לא מבין למה זה עושה לי איזשהי בעיה.... הרי שמתי את ה\0 כדי למנוע מהמשפט להמשיך... אז מה הבעיה בידיוק?

ושוב תודה על הזמן שלכם!


Tears Will Get You Sympathy,
Sweat Will Get You Results!


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
DLN
חבר מתאריך 20.4.07
15884 הודעות
   14:16   19.12.09   
אל הפורום  
  6. זה היגיון חשוב מה שעשית אבל זה לא מונע OVERFLOW  
בתגובה להודעה מספר 3
 
   במידה ומישהו יכניס 400 תווים כבר בCIN, עדיין יהיה לך OVERFLOW


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Sn00py 
חבר מתאריך 1.8.02
2954 הודעות
   15:29   19.12.09   
אל הפורום  
  7. פתרון די פשוט  
בתגובה להודעה מספר 3
 
   cin.get
תקרא על זה קצת - הפרמטר השני יגביל את מס' התווים לקריאה וכך ימנע overflow.
מה שכתבת לא ימנע - בגלל שזה יקרה עוד ב cin >> second.

\x6C\x65\x65\x74\x68\x61\x78\x30
\x72\x3A\x2D\x29
tresp4sser


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
spidey1  
חבר מתאריך 1.7.02
25536 הודעות
   23:54   19.12.09   
אל הפורום  
  8. אסור לנו להשתמש בCIN.GET או משהו כזה  
בתגובה להודעה מספר 7
 
   הדבר היחיד שמותר להשתמש זה הcin.width כי זה הדבר היחיד שלימדו אותנו..
.אני אבדוק ביום שני בשיעור אם אני אמור בכלל לדאוג למצב של קלט ארוך מההגדרה של המחרוזת, אם כן, אני חושש שהברירה היחידה היא לולאה...


Tears Will Get You Sympathy,
Sweat Will Get You Results!


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
spidey1  
חבר מתאריך 1.7.02
25536 הודעות
   23:55   19.12.09   
אל הפורום  
  9. המון תודה לכולם! מעריך את זה מאוד!  
בתגובה להודעה מספר 0
 
  


Tears Will Get You Sympathy,
Sweat Will Get You Results!


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

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

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



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