עבור לתוכן

C++ מה זה התוספת s_

Featured Replies

פורסם

ב++C

מאז שעברתי לויזואל סטודיו 2012 הוא מבקש ממני להשתמש במקום scanf להשתמש בscanf_s אז רציתי לשאול מה ההבדל

בקיצור מה השימוש של _s

פורסם

מישהו שאל אותה שאלה בדיוק בדיון אחר. התשובה שלי:

הפונקציה scanf חשופה לסוג של פירצת אבטחה שנקראת Buffer Overflow (אבל רק אם משתמשים בה כדי לקרוא מחרוזות, כלומר ב-s%). הקומפיילר מזהיר מפני זה ומייעץ להשתמש בגרסה "בטוחה" של הפונקציה בשם scanf_s, אבל בשביל מישהו שרק לומד לתכנת זה לא כזה קריטי (במיוחד אם אתה לא משתמש בה לקרוא מחרוזות).

ההבדל הוא שעל מנת לקרוא מחרוזת באמצעות scanf אתה צריך להעביר מערך של תווים (משתנה מסוג *char), וכשאתה משתמש ב-scanf_s אתה צריך להעביר בנוסף למערך הזה גם מספר שאומר מהו גודל המערך (מספר התווים המקסימלי שאתה מרשה לקרוא לתוכו).

אגב, ב-++C לא משתמשים ב-scanf, משתמשים ב-cin.

נערך על-ידי שניצל

פורסם
  • מחבר

איזה יתרון יש לCIN על SCANF או לCOUT על PRINTF?

פורסם

המון. type safe למשל, קריאות, נוחות שימוש, פחות מועד לשגיאות, ניתן להרחבה...

מצד שני printf מעט מהיר יותר. תשתמש בזה רק אם יש לך סיבה טובה במיוחד (embeded למשל)

פורסם

קודם כל הם יותר חסינים מפני שגיאות. בעקרון 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/

פורסם
  • מחבר

הבנתי תודה

ארכיון

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

דיונים חדשים