עבור לתוכן

שאלה על משפטי switch

Featured Replies

פורסם

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

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

אם יש סיבה אחרת לשימוש ברווח אשמח לשמוע.

עריכה: אני רואה ש Access denied המליץ גם על זה.

פורסם

רק שניקוי ה stdin זה גם דבר שאינו תקני (כן, גם אני מאוד הופתעתי) ועובד רק בחלק מהקומפיילרים (כן, אין דרך סטנדרטית לנקות את ה-buffer). אפשר לפתור את זה בקלות ע"י לולאה פשוטה, או פשוט לכתוב הערות בקוד, שידגישו את הרווח הזה.

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

פורסם

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

את זה לא ידעתי, תודה.

פורסם

יש פיתרון מעניין לבעיה שיגאל מעלה אפשר לרשום משהו כזה:

scanf(" " "%c",&G);

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

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



#define SKIP_WHITESPACES " "
scanf(SKIP_WHITESPACES "%c",&G);

פורסם

רק שניקוי ה stdin זה גם דבר שאינו תקני (כן, גם אני מאוד הופתעתי)

מאיפה הביסוס שלך לזה בדיוק? הסתכלתי בוויקיפדיה בעמוד https://en.wikipedia.org/wiki/ANSI_C

ומהלינקים שם בסוף יש טיוטה של התקן משנת 1988: http://flash-gordon.me.uk/ansi.c.txt

ו-fflush מוזכר שם. אם יש קומפיילר שלא ממש אותו אז הוא לא מממש את התקן.

פורסם

לא אמרתי ש-fflush לא תקני, אמרתי ש-(fflush(stdin לא תקני.

ציטוט מתוך התקן שקישרת אליו:

4.9.5.2 The fflush function

If stream points to an output stream or an update stream in which

the most recent operation was output, the fflush function causes any

unwritten data for that stream to be delivered to the host environment

to be written to the file; otherwise, the behavior is undefined.

ובסוף המסמך, תחת הכותרת "Undefined behavior":

* The stream for the fflush function points to an input stream or to

an update stream in which the most recent operation was input

($4.9.5.2).

דהיינו, הפעולה לא מוגדרת עבור input stream.

פורסם

אוקיי הבנתי. מצטער על הבלבול :)

פורסם

יואב, אפשר ליצור באפר בגודל 200 (בהנחה שטקסט שמוכנס קטן מ-200) וכל פעם לנקות אותו ולהשתמש ב-sscanf.

זה אמור לעבוד, לא?

פורסם

הכל אפשרי, אבל איך תמלא את הבאפר? עד סוף השורה כל פעם?

ארכיון

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

דיונים חדשים