פורסם 2008 בדצמבר 1816 שנים למה הקוד הבא מבצע את הprintf פעמיים לפני השהוא מבצע scanf נוסף ?#include <stdio.h>int main(){ char selection; do { printf("enter a character:\n"); scanf("%c",&selection); }while(selection!='e'); return 0;}
פורסם 2008 בדצמבר 1816 שנים אני לא ממש מבין בזה אבל נתקלתי במשהו דומה פעם. תנסה לקרוא לפונקצייה flushall() לפני הscanf.
פורסם 2008 בדצמבר 1816 שנים אני לא מבין בזה ממש (למדתי C באופן בסיסי לפני 6 שנים בערך וולא השתמשתי בזה ממש)אבל נראה לי שאתה יכול להכניס WILE עם משתנה בשם I שגודל כל פעם ב1 ותנאי שכל עוד ן גדול או שווה ל1 שהוא יבצע את ה SCANF ואז I יתחיל עם ערך של 1 בתור דיפולט ואחרי פעם אחת הוא יגדל ב 1 (יהיה בעל ערך של 2 ) ואז התנאי ישבר ולא יתבצע עוד SCANFנ.ב אני ממש לא משוכנע שזה הפיתרון אבל אולי
פורסם 2008 בדצמבר 1816 שנים למה הקוד הבא מבצע את הprintf פעמיים לפני השהוא מבצע scanf נוסף ?בגלל שאתה קולט אות אחת רק, אבל בשביל לסיים את הפקודה אתה לוחץ ENTER, שמכניס בעצם עוד אות בפעם הבאה (אות של שורה חדשה).
פורסם 2008 בדצמבר 1816 שנים היי,תכניס :#include <stdio.h>int main(){ char selection; do { printf("enter a character:\n"); scanf("%c",&selection); fflush(stdin); }while(selection!='e'); return 0;}
פורסם 2008 בדצמבר 1816 שנים תוסיף getchar()כמו כאן:#include <stdio.h>int main(){ char selection; do { printf("enter a character:\n"); scanf("%c",&selection); getchar(); }while(selection!='e'); return 0;}
פורסם 2008 בדצמבר 1916 שנים אחרי הscanf הראשון נותר לך קוד של NEWLINE בבאפר של stdinהscanf השני מתבצע,אבל אם תבדוק טוב טוב,תראה שהוא מכניס 10 (הקוד ASCII של שורה חדשה) לתוך המשתנה שלך.כמו שאמרו לעיל,אתה צריך לנקות את הבאפר לפני כל קריאה ל scanf - בעזרת fflush.אגב:תזהר משימוש בflushall,הוא מאפס את כל הבאפרים הפתוחים בתוכנית שלך - זה יכול להיות מאוד מסוכן אם אתה מבצע flushall שיש לך קובץ פתוח בתוכנית
ארכיון
דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.