האם הפקודה ()flushall היא ב ANSI C?

אחמס1

New member
האם הפקודה ()flushall היא ב ANSI C?

קיבלנו בשיעורי הבית הדרכה איך לנקות את הבאפר אם scanf נכשלת, אבל הקופיילר של GNU לא מכיר בכלל בקיומה של ()flushall
undefined reference to `flushall'​
האם צריך לכלול ספרייה נוספת או משהו? האם יש פתרון אחר? תודה מראש.
 

annefan

New member
היא לא

יותר מזה, fflush (שהיא כן סטנדרטית) היא לא מוגדרת (Undefined Behaviour) של input streams. gcc אכן לא מגדירה את הפונקציה הזו.
 

annefan

New member
צריך לעשות מזה FAQ!!

גם fflush(stdin) היא לא סטנדרטית. היא גם Undefined Behaviour. הפתרון יהיה כנראה סוג של לולאה:
printf("input j: "); fflush(stdout); j = getchar(); do { c = getchar(); } while (c != EOF && c != '\n');​
 

אחמס1

New member
(fflush(stdin מתקמפל אבל לא עוזר.

והשתמשתי עוד בטאג הansi של gcc. אני די בטוח שהשתמשתי במקום הנכון:
double get_number(void) { int check; double num=0; check=scanf("%lf", &num); while ((check<1)||(num < 0)) { printf("Enter a positive real number: "); fflush(stdin); check=scanf("%lf", &num); } return num; }​
הבעיה שאם מוכנס תו שהוא לא מספר, הפונקציה נכנסת ללולאה אינסופית (ההודעה מודפסת, אבל המחשב לא מחכה לקלט בכלל). שוב תודה על תגובות.
 

אחמס1

New member
האם אין שום פתרון אחר? הייתי מעדיף

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

annefan

New member
וזה יעזור כי?

ויני, 'תוכחנו על זה כבר. אין ב-gcc דרך לעשות flush ל-input stream. אין! הלולאה שהצעתי היא שרך אחת. הדרך שלך טובה יותר. אבל אין fflush ל-input streams. חפש ב-google groups כמה אנשים שוברים על זה את השיניים.
 

vinney

Well-known member
הוא משתמש בGCC ?

לא שמתי לב FLUSH NULL מנקה את כל הבאפרים שיש, קלט, פלט, לא משנה. אם GCC לא מממש באפרים לפלט, אז המצב לא ישתפר, אבל לפי דעתי כדאי לנסות. אני אומנם לא עובד בGCC אלא בVC, שם זה עובד מצוין, אבל אני עדיין מציע את זה כדרך לנסות. להזיק, זה בטוח לא יזיק. וחבל שהמורה שלהם לא הסביר להם על GETS וSSCANF, המורים בביצפר כנראה מתחת לכל ביקורת....
 

אחמס1

New member
זה לא בדיוק בית ספר...

זה אחד הקורסים הפחות-מקיפים של הטכניון (לומדים מספר אינפיניטסימלי של פונקציות מובנות). ניסיתי (fflush(NULL אבל זה לא עזר. אז אני חושב שאני פשוט אמצא פתרון יצירתי (כמו קריאת תווים נפרדים ופיענוח).
 

vinney

Well-known member
הפתרון הטוב הוא

מה שהצעתי לך קודם - שילוב של GETS עם משהו אחר, לדוגמא SSCANF או ATOF. SCANF זו משפחה מסוכנת של פונקציות, הבעיה שנתקלת בה היא אחת מני רבות הקשורות למשפחת הSCANF, סתם שתהיה מודע לזה
עדיף להמנע משימוש בה
 
למעלה