בדיקת קלט בשפת C - תכנות - HWzone פורומים
עבור לתוכן
  • צור חשבון

בדיקת קלט בשפת C


lompy

Recommended Posts

אני מנסה לעזור לחבר בשפת C אבל אני קצת חלוד בזה אז

אולי תוכלו לעזור לי לפתור בעיה לא מסובכת מידי.

לא כל כך משנה מה התוכנית עושה אבל היא קולטת מספר מהמשתמש (כל מספר בעולם)

אז הגדרנו בתוכנית משתנה int ולתוכו נקלט המספר

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

התוכנית משתגעת ועושה לולאה אין סופית (לא יודע למה אולי זה קשור לקוד עצמו שבודק בלולאה את תקינות

טווח המספר שנקלט).בכל מקרה התוכנית צריכה לצאת החוצה ברגע שמנסים להכניס אות או תו שהוא לא מספר

לא עולה לי רעיון איך לעשות את זה. אני מניח שנצרך להגדיר משתנה זמני שהוא לא int לבדוק שהוא לא אות ורק אז

להמשיך בתכונית אבל מה בדיוק לעשות אני לא יודע

קישור לתוכן
שתף באתרים אחרים

int main(){

int target;

for( ; ; ){

scanf("%d",&target);

while ((target>20 || target<1) && target!=50){

printf("\nyou have insert an illigal number (%d). try again (1-20,50)",target);

scanf("%d",&target);

}

....

קיצרתי את הקוד כדי לא לסבך בעיקרון מה שקורה כאן שנקלט מספר הוא בודק שהמספר בתחום ואם הוא לא בתחום אז הוא מתבקש להכניס מספר אחר

כל הקוד של התוכנית נמצאת בלולאה אין סופית שנגמרת רק כשמשתנה אחר שלא כתבתי אותו למעלה(שוב כדי לא לסבך) מגיע ל0 ואז

יש return 0 והתוכנית מסתימת

הלולאה האין סופית שהוא ,כשמכניסים תו במקום מספר למשתנה של ה int ,היא הלולאה של בדיקת תקינות הקלט ולא הלולאה החיצונית

כלומר מכניסים תו הוא בודק את התקינות ואז הוא לא מבקש להכניס שוב משהוא אחר אלא בודק שוב ושוב ושוב את הקלט אפילו שאף אחד לא הזין כלום

(מדפיס בלי סוף you have insert an illigal number אבל לא עוצר לקלוט מספר אחר)

קישור לתוכן
שתף באתרים אחרים

ה FOR יוצר בכוונה לולאה אין סופית ככה שאני יכול לחזור על הקוד של התוכנית שוב ושוב כמה פעמים שצריך

עד שמתבצע איזה תנאי מסווים ובתוכו אני רושם return 0 והתוכנית מסתימת

אבל זה לא הנקודה עכשיו

מה שנראה לי שצריך לעשות זה להגדיר CHAR ולקלוט עם getchar את המספר ברגע שהוא יראה ערך אסקי של תו שהוא לא מספר

להגדיר לו לעוף מהתוכנית

אבל במקרה כזה אני לא יודע איך לקלוט מספר עם אני יכניס לדומא 1234 הוא יקלוט 1 אחר כך 2 וכו

הוא לא ידע שזה מספר אחת ארוך .אולי אפשר להוסיף איזה אינקס שיספור כמה מספרים נקלטו ולשחזר את המספר המקורי

זה לא יכול להיות מסובך ,פשוט עבר כבר זמן מאז שהתעסקתי עם זה

קישור לתוכן
שתף באתרים אחרים

אתה לא הבנת, אם ה while לא מתקיים אז הקלט חוקי והתוכנית ממשיכה לרוץ לשאר הקוד שלא הבאתי כאן כי זה לא משנה מהוא

הוא יכנס ל while רק אם הקלט לא חוקי ויבקש להזין אותו שוב

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

ואני צריך שבמקרה והודפס משהוא שהוא לא מספר שתוכנית תעוף.מה שקורה אצלי זה שמנסים להכניס תו (CHAR) למשתנה שהוא מספר(INT)

התוכנית משתגעת.

צריך לשכלל את מנגנון הבדיקה ככה שקודם הוא יבדוק עם הודפס מספר או משהוא אחר ובמידה והודפס רק מספר בלי תוספות רק אז להכניס את

המספר הזה ל target והתוכנית תמשיך לרוץ כרגיל וזה בדיוק מה שאני לא יודע איך לעשות

קישור לתוכן
שתף באתרים אחרים

המבנה הנכון לבדיקות קלט הוא:


קלט
WHILE (תנאי)
הודעת שגיאה
קלט
סוף לולאה

המשך קוד

תשנה את הקוד שלך לפי זה, וזה יעבוד.

ד"א, שים לב מה אתה קולט, כי הוא עשוי לעשות לך בעיות עם קודי הASCII של תווים אם אתה לא מכניס לו מספרים.

קישור לתוכן
שתף באתרים אחרים

scanf מחזיר את מספר השדות שהוא קרא בהצלחה.

על כן אם scanf שלך מחזיר 1 אתה יודע שהוא קרא את המספר בהצלחה.

אם הוא מחזיר משהו אחר סימן שהכניסו תווים לא חוקיים (שאינם מספר).

הערה: אני לא בטוח מה יקרה אם יכניסו מספר ואחריו אותיות לדוגמא "24g". נא לבדוק בתיעוד או ע"י ניסוי.

קישור לתוכן
שתף באתרים אחרים

scanf מחזיר את מספר השדות שהוא קרא בהצלחה.

על כן אם scanf שלך מחזיר 1 אתה יודע שהוא קרא את המספר בהצלחה.

אם הוא מחזיר משהו אחר סימן שהכניסו תווים לא חוקיים (שאינם מספר).

הערה: אני לא בטוח מה יקרה אם יכניסו מספר ואחריו אותיות לדוגמא "24g". נא לבדוק בתיעוד או ע"י ניסוי.

זה קידם אותי מאד וזה עובד חלקית אם מכניסים תו או תו ומספרים זה עובד

אבל אם מספר ואז תו כמו בדוגמא שלך זה עדין משתגע

יש לך אולי עוד רעיון

---עריכה----

סליחה טעות שלי זה לא משתגע פשוט לא סידרתי את כל הקוד כמו שצריך

מה שהוא עושה זה לקלוט את המספר עד התו הריאשון

וזה עדין לא טוב לי כי זה אמור לעוף

קישור לתוכן
שתף באתרים אחרים

הנה טריק נחמד.

תשתמש ב-scanf("%d%s") (כלומר קלוט תו ואז מחרוזת) ואז תוודא ש:

א) ערך החזרה הוא 1 ולכן הוכנס רק מספר

או

ב) ערך החזרה הוא 2 אבל המחרוזת היא ריקה (או מכילה רק רווחים, whitespace, ואולי new line).

עוד אופציה:

לקלוט מראש מחרוזת ואז להשתמש ב-strtol בשביל לתרגם אותה למספר. strtol מחזיר מצביע לתו הראשון שהוא אינו חלק מהמספר, ולכן אם הוכנס מספר אזי strtol יחזיר NULL (או אולי מצביע לתו סיום מחרוזת כלומר "0\").

קישור לתוכן
שתף באתרים אחרים

אתה יכול גם להוסיף fflush אחרי scanf זה יפתור לך את הבאג עם הלולאה האין הסופית, לדוגמה:

while ( (target < 1 || target > 20) && target != 50 )
{
printf ("Enter a value between 1 - 20: ");
scanf("%d",&target);

fflush (stdin);

}

קישור לתוכן
שתף באתרים אחרים

אחרי הפיתרון הקודם זה כבר לא נחוץ וגם אני צריך שזה יעוף מהתוכנית (מה שהפיתרון שלך לא נותן לי)

אבל ניסתי אותו בכל מקרה והוא אכן עובד מצויין ,שמחתי ללמוד משהו חדש נוסף היום

ושוב תודה לכולם על התגובות

קישור לתוכן
שתף באתרים אחרים

ארכיון

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

×
  • צור חדש...