עבור לתוכן
View in the app

A better way to browse. Learn more.

HWzone

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

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

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 בתוכנה הזאת נותן אזהרה.

ארכיון

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

דיונים חדשים

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.