פורסם 2009 בדצמבר 2315 שנים אני לומד באוניברסיטה קורס C.לפני זה כבר ידעתי C# ושם לא היו כל מיני בעיות עם הקלט.ב- C יש בכל מיני קומפיילרים שונים כל מיני אזהרות על פונקציות קלט.לדוגמה, בקומפיילר של מיקרוסופט (Visual C++) יש אזהרה על הפונקציה scanf.בקומפיילר GCC יש אזהרה על הפונקציה gets.אני מבין שב- C++ משתמשים ב- cin, אבל אני כרגע בקורס לא יכול להשתמש בפונקציה הזאת.אז רק רציתי לדעת באיזו פונקציית קלט הכי כדאי לי להשתמש כדי לקלוט מספרים (scanf?) ובאיזה כדאי לי למחרוזות(gets?)?ראוי לציין שכרגע אני משתמש בפונקציות שרשמתי בסוגריים.
פורסם 2009 בדצמבר 2315 שנים יש כזכור לי גירסה בטיחותית של כל פוקציה עם קו תחתון בתחילת השם._getch()_scanf()וכו, אף אחד לא יכעס עליך אם תשתמש בהן.אבל אתה יכול פשוט להתעלם מההזהרות וזו..
פורסם 2009 בדצמבר 2315 שנים getch לא קשורה, זו פונקציה שקוראת מקש אחד מהמקלדת. חוץ מזה היא גם לא חלק מהתקן של C.הקומפיילר מזהיר אותך מפני scanf ו-gets כיוון שהן יכולות לגרום לחריגות מגבולות המערך. תחשוב על הקוד זה:char buffer[41];gets(buffer);נשמע תקין, לא? אבל מה קורה אם המשתמש מכניס מחרוזת באורך יותר מ-40? הפונקציה gets לא יודעת מה האורך של המערך, ולכן היא יכולה בטעות לחרוג ממנו (כלומר לכתוב על המקומות ה-41 והלאה). ב-#C אין בעיה כזו כי שם מחרוזות הן לא מערכים אלא טיפוסים בפני עצמם.באותו אופן אם תעשהscanf("%s", buffer);יכול לקרות אותו דבר.בשביל להימנע מהבעיה הזו, צריך להשתמש בגרסאות של scanf/gets שיכולות להגביל את אורך הקלט. במקום gets צריך להשתמש ב-fgets (עוד הסבר כאן), וב-scanf אפשר להגביל את אורך הקלט באמצעות:scanf("%40s", buffer);ככה הקלט מוגבל ל-40 תווים (תזכור שצריך תו אחד נוסף בשביל ה-null terminator), או להשתמש בגרסה ה"מוגנת" שלה, scanf_s (חפש ב-msdn).איזו אזהרה אתה מקבל כשאתה משתמש ב-scanf של int?
פורסם 2009 בדצמבר 2415 שנים מחבר אני כבר יודע למה הפונקציות האלה מסוכנות (בכל מקרה תודה על ההסבר).מה שחיפשתי באמת היה פונקציה כמו fgets אז תודה על התשובה.איזו אזהרה אתה מקבל כשאתה משתמש ב-scanf של int?אני לא משתמש ב- Microsoft Visual C++ אבל מתישהו ראיתי שכל שימוש (לא משנה אם זה מספר או מחרוזת) ב- scanf בתוכנה הזאת נותן אזהרה.
ארכיון
דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.