יש בעיה קטנה

andav

New member
בבקשה../images/Emo13.gif

נתחיל מהסוף: היכן מאוכסן התו(במיקרה הספציפי הזה, ENTER) לפני שהוא ניקלט ב- scanf השני,בתוכנית שהבאתי לכאן? האם הדבר קורה גם כאשר מדובר בקליטה של מספר ולא רק של תו? במיקרה שלנו(בתוכנית)קלטנו תווים מהמיקלדת ופה shaiby הנחמד הסביר שזה בגלל שתו ה- ENTER נכנס ל- scanf הבא,אבלאם ב- scanf הבא לא היו נקלטים,שוב, char אלא מספרים(%d) מה היה קורה אם ה- ENTER של מקודם? תודה רבה. מקווה שהובנתי
 

vinney

Well-known member
עדיין לא כ"כ ברור, אבל אנסה לענות

במקרה של SCANF, הENTER מהווה סוף קלט ותחילת הפרישה של הקלט לפי הFORMAT STRING. מכיוון שבFORMAT STRING לא ביקשת לעבד את הENTER - הSCANF עוצרת עליו ומשאירה אותו בBUFFER של הקלט, עד הקריאה הבאה, זאת בהנחה שאולי אז תרצה את הENTER. כדי להמנע ממצב הזה יש לבצע FFLUSH לSTDIN, שמנקה את הBUFFER, כמו שאמרו. לגבי השאלה השניה - SCANF היה מתעלם מהENTER (ומכל דבר אחר), עד שהיה מזהה משהו שניתן לפרוש לפי הגדרה של d%, במקרה כזה לא היית צריך לעשות FFLUSH.
 

andav

New member
שאלתי הייתה (לאחר שקראתי את

תשובותיך)מה זה BUFFER ? ולמה הוא קיים? האם הוא קיים למשתנים מסוג char בלבד? תודה.
 

vinney

Well-known member
BUFFER נועד לאפשר קלט רציף

זה כלי חבוי ממך, והוא חלק מספריה הסטנדרתית. הוא קיים כשאתה משתמש ב *FILE. שימוש בקלט/פלט סטנדרטי משתמש ב*FILE, שוב, באופן שקוף לך. כל הקלט מועבר מקובץ (STDIN במקרה שלנו) לBUFFER הזה, וSCANF לוקחת את הקלט משם, ופורשת אותו לפי הFORMAT STRING שניתן לו. כל הפלט גם הוא מועבר על ידי הPRINTF לBUFFER של הפלט (קובץ הSTDOUT), ונשפך לקובץ עצמו (מסך בד"כ) באופן אוטומטי על ידי הספריה הסטנדרטית. זה משהו שקוף לך, עקרונית אתה לא אמור להתעמק בזה, ואם היית מתכנן את הקלט שלך יותר טוב (על ידי הוספת "n\" לFORMAT STRING למשל), גם לא היית נתקל בבעיה שנתקלת בה. באופן עקרוני, שימוש בSCANF או FSCANF לא מומלץ, עדיף להשתמש בצמד FGETS+SSCANF.
 

andav

New member
שלום לך שוב,תודה ועוד שאלות

מה הכוונה format string? האם הכוונה ל- %d או %c או %f, כלומר איך אני רוצה את הפלט? מדוע ואיך הוספת התו של הורדת השורה(/n) היה מסדר את העניין? מה ההבדל בין scnaf ל- sscanf? ולסיום,למה צריך את עניין הבאפר? כלומר,מדוע כשאני מדפיס למסך,מה שמודפס מגיע מהבאפר ולא מהמשתנה/משתנים עצמם? וגם(לחילופין),מדוע שאני קולט משהו למשתנה ,קודם לקליטה עצמה,הקלט מגיע ל- באפר ואז למשתנה עצמו? מה נחוץ העניין הזה? למה זה לא מתבצע ישירות? אפשר הסבר קצר? תודה לך.
 

vinney

Well-known member
לא יזיק לקרוא ספר לפעמים

יש גבול לכמה אפשר ללמד C בלענות על השאלות בפורומים, מה שאתה שואל כתוב בכל ספר של C - קח ותקרא, אחרת לא נצא מזה.
 

shaiby

New member
מצאתי, מצאתי !!!

זה מה שחסר לך, בין שני חלקי התוכנית :
fflush( stdin );​
 
למעלה