פורסם 2013 בנובמבר 412 שנים ב++Cמאז שעברתי לויזואל סטודיו 2012 הוא מבקש ממני להשתמש במקום scanf להשתמש בscanf_s אז רציתי לשאול מה ההבדל בקיצור מה השימוש של _s
פורסם 2013 בנובמבר 412 שנים מישהו שאל אותה שאלה בדיוק בדיון אחר. התשובה שלי:הפונקציה scanf חשופה לסוג של פירצת אבטחה שנקראת Buffer Overflow (אבל רק אם משתמשים בה כדי לקרוא מחרוזות, כלומר ב-s%). הקומפיילר מזהיר מפני זה ומייעץ להשתמש בגרסה "בטוחה" של הפונקציה בשם scanf_s, אבל בשביל מישהו שרק לומד לתכנת זה לא כזה קריטי (במיוחד אם אתה לא משתמש בה לקרוא מחרוזות).ההבדל הוא שעל מנת לקרוא מחרוזת באמצעות scanf אתה צריך להעביר מערך של תווים (משתנה מסוג *char), וכשאתה משתמש ב-scanf_s אתה צריך להעביר בנוסף למערך הזה גם מספר שאומר מהו גודל המערך (מספר התווים המקסימלי שאתה מרשה לקרוא לתוכו).אגב, ב-++C לא משתמשים ב-scanf, משתמשים ב-cin. נערך 2013 בנובמבר 412 שנים על-ידי שניצל
פורסם 2013 בנובמבר 412 שנים המון. type safe למשל, קריאות, נוחות שימוש, פחות מועד לשגיאות, ניתן להרחבה...מצד שני printf מעט מהיר יותר. תשתמש בזה רק אם יש לך סיבה טובה במיוחד (embeded למשל)
פורסם 2013 בנובמבר 412 שנים קודם כל הם יותר חסינים מפני שגיאות. בעקרון printf ו-scanf יכולות לקבל כל רשימת פרמטרים - גם אם זו לא תואמת את מחרוזת ה-format, לדוגמה הקוד הזה יתקמפל:double x;printf("%d", x);למרות שהוא לא תקין (צריך להדפיס את x באמצעות f%).או אפילו אפשר לעשות כזה דבר בטעות:printf("%d%d", x);שזה גם יתקמפל, אבל לא ירוץ נכון (כי היית צריך להעביר שני פרמטרים במקום אחד). נראה לי ש-Visual Studio ידע לתת אזהרה על דבר כזה, אבל טכנית זה קוד חוקי.לעומת זאת, בשימוש ב-cout אתה פשוט עושה cout << x, ואי אפשר להתבלבל - הוא ידפיס אותו כ-double.בנוסף, cin ו-cout הם ניתנים להרחבה, כלומר אתה יכול להגדיר למחלקה שלך את האופרטור << או >> ככה שיהיה אפשר להדפיס אותה או לקרוא לתוכה מהקלט באמצעות cin ו-cout. יש הסבר על זה כאן:http://www.learncpp.com/cpp-tutorial/93-overloading-the-io-operators/
ארכיון
דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.