עבור לתוכן

פונקציית קלט בלי אזהרות

Featured Replies

פורסם

אני לומד באוניברסיטה קורס C.

לפני זה כבר ידעתי C# ושם לא היו כל מיני בעיות עם הקלט.

ב- C יש בכל מיני קומפיילרים שונים כל מיני אזהרות על פונקציות קלט.

לדוגמה, בקומפיילר של מיקרוסופט (Visual C++) יש אזהרה על הפונקציה scanf.

בקומפיילר GCC יש אזהרה על הפונקציה gets.

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

אז רק רציתי לדעת באיזו פונקציית קלט הכי כדאי לי להשתמש כדי לקלוט מספרים (scanf?) ובאיזה כדאי לי למחרוזות(gets?)?

ראוי לציין שכרגע אני משתמש בפונקציות שרשמתי בסוגריים.

פורסם

יש כזכור לי גירסה בטיחותית של כל פוקציה עם קו תחתון בתחילת השם.

_getch()
_scanf()

וכו, אף אחד לא יכעס עליך אם תשתמש בהן.

אבל אתה יכול פשוט להתעלם מההזהרות וזו..

פורסם

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?

פורסם
  • מחבר

אני כבר יודע למה הפונקציות האלה מסוכנות (בכל מקרה תודה על ההסבר).

מה שחיפשתי באמת היה פונקציה כמו fgets אז תודה על התשובה.

איזו אזהרה אתה מקבל כשאתה משתמש ב-scanf של int?

אני לא משתמש ב- Microsoft Visual C++ אבל מתישהו ראיתי שכל שימוש (לא משנה אם זה מספר או מחרוזת) ב- scanf בתוכנה הזאת נותן אזהרה.

ארכיון

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

דיונים חדשים