בעיה מוזרה ב C

Ziggy Star

New member
בעיה מוזרה ב C

אני צריך לרשום תוכנית של ספר טלפונים ב C .. בעל תפריט חוזר .
יש לי בעיה מוזרה שאני לא מצליח לפתור , כל עוד אני לא נכנס לתפריט , הכל עובד טוב ויפה . ברגע שאני מוסיף את התפריט , התוכנית מתרסקת
אני מצרף את קוד המקור ..
#include <stdio.h> #define CAPACITY 100 #define TRUE 1 #define FALSE 0 typedef struct { char strName[30]; long lPhone; }Friend; typedef struct { Friend friendsArray[CAPACITY]; int nNumberOfFriends; }PhoneBook; short menu() { short Choice; printf("\n\t1.Insert a New name"); printf("\n\t2.Delete a name"); printf("\n\t3.Print the all address book"); printf("\n\t4.Search the address book for a name"); printf("\n\t5.Exit"); printf("\n"); do { printf("\tMy choice is :"); scanf("%d" ,&Choice); } while (Choice>5||Choice<1); return Choice; } short addFriend(PhoneBook* ptrPB) { if(ptrPB->nNumberOfFriends == CAPACITY) { printf("Too many friends...\n"); return FALSE; } printf("\nEnter Name: "); scanf("%s", &(ptrPB->friendsArray[ptrPB->nNumberOfFriends].strName)); printf("Enter Phone Number: "); scanf("%d", &(ptrPB->friendsArray[ptrPB->nNumberOfFriends].lPhone)); ptrPB->nNumberOfFriends++; return TRUE; } void main() { short Choice,Answer ; PhoneBook pbMyBook; pbMyBook.nNumberOfFriends = 0; // Choice=menu(); addFriend(&pbMyBook); }​
ברגע שאני מוריד את ה // ליד choice=menu() h התוכנית מתרסקת ברגע שאני לוחץ על משהו בmenu יש למישהו מושג מה הולך פה .. הרי 2 בדברים לא קשורים אחד לשני ..
 

ahab

New member
short...

אתה מנסה לקרוא תוך short בעזרת d%. צריך להשתמש ב-hd%, אם אני זוכר נכון..
 

Ziggy Star

New member
../images/Emo51.gif../images/Emo51.gif../images/Emo6.gif

מה שאות אחת יכולה לעשות
יומיים אני שובר את הראש על הבעיה הזאת
 

Ziggy Star

New member
אווף ../images/Emo46.gif מה זה הדברים המוזרים האלה?

איך יכול להיות בקוד בין 10 שורות באג ???
מישהו יכול להגיד לי מה אני מפספס פה ?? זו דוגמא קטנה שהרצתי כדי לראות למה הקוד שלי פועל באופן משונה (לא רציתי להעלות את כל הקוד לפה כי הוא קצת ארוך ! אז עשיתי את הדוגמא הקטנה הבאה
) משום מה כשאני מריץ את התוכנית , בקליטה השניה של ה Y ו N הוא מדפיס לי פעמים לפני שהוא בא לקלוט .. משום מה הוא מדלג פעם אחת על SCANF , ומצבע רק בפעם השניה

#include <stdio.h> void main() { int i; char Answer,YNAnswer; printf("\nFirst input"); do { printf("\n\tY/N"); scanf("%c",&YNAnswer); } while (YNAnswer!='N' && YNAnswer!='n' ); printf("\nthis is just a test !!! "); do { printf("\n\tY/N"); scanf("%c" ,&Answer); } while (Answer!='Y' && Answer!='y' ); }​
למישהו יש רעיון
? שבת שלום ומבורך לכל אנשי הפורום , ולכל עם ישראל באשר הוא
 

Ziggy Star

New member
כמובן ../images/Emo6.gif איך אני לא חשבתי על זה ??

אבל אולי רק תסביר לי ..
על מה אתה מדבר
מה זה FFLUSH ?? מה זה STDIN ?? ואיך זה יפתור לי את הבעיה ???
 

vinney

Well-known member
נורא פשוט (חיפוש בפורום? ../images/Emo13.gif )

הקטע הוא שבקלט הראשון לחצת ENTER כשהכנסת את הקלט, אבל לא קראת את הENTER הזה בתוכנית. הENTER הזה לא נעלם, הוא נשאר בBUFFER של הקלט עד הפעם הבאה שתבצע איזהשהו קלט, אולי תרצה אותו. בפעם הבאה אתה אכן מבקש CHAR, ולכן אתה מקבל את הENTER, ונאלץ לחזור על השאלה למשתמש. מה שFFLUSH עושה לקובץ שאתה נותן לו הוא איפוס הBUFFER הזה, והקובץ שלך זה הקלט הסטנדרטי STDIN. באותיות קטנות הכל, כמובן.
 

Ziggy Star

New member
אהה.. עכשיו זה ברור ../images/Emo9.gif אז למה הוא

מחכה לENTER .. האם יש דרך לקלוט תו בלי לחיצה על ENTER . אני זוכר ש בביסיק היתי עושה את זה בעזרת INKEY$ , יש דרך לעשות את זה ב C ??
 

HaRmosh

New member
kbhit לא קולט תו...

רק מחזיר ערך שאומר האם נלחץ מקש או לא. ()getch קולט תו, כך:
char c; c = getch();​
 

vinney

Well-known member
getchar!!!!!

למה להשתמש בשטויות של מייקרוסופט כשיש פונקציה תקנית לדבר הזה?
 

vinney

Well-known member
אז זהו שזה לא מדויק

אם תשתמש רק בgetchar - לא תגיע רחוק - תצטרך להתמודד עם אותה הבעיה. שימוש kbhit לעומת זאת מאפשר לך להתעלם מgetchar שמחזיר לך ENTER, בלי לעשות FFLUSH.
 
למעלה