עבור לתוכן

שפת סי, בדיקת תקינות מחרוזת

Featured Replies

פורסם

היי, כחלק משיעורי הבית שלי אני צריכה לכתוב קוד שבודק תקינות קלט ומכניס אותו למערך דו מימדי (בגודל ידוע), אני צריכה עזרה בבדיקת תקינות הקלט בבקשה.

אני צריכה לקבל מהמשתמש קלט בצורה של num num num...

כלומר - מספר-רווח-מספר-רווח-מספר

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

היה לי רעיון להשתמש בלולאה שבה יש scanf עם %d ומתחתיה יש משתנה מסוג char שמתחיל לקלוט איפה שd הפסיק והוא צריך לקחת את כל הרווחים. ברגע שהוא קולט משהו ששונה מרווח (חשבתי לעשות את זה ע"י זיהוי של קוד האסקי) הוא מוציא הודעת שגיאה. הבעיות הן:

א. אני לא יודעת כמה פעמים להריץ את הלולאה. אם אני אריץ אותה כמספר המספרים שאני אמורה לקבל המשתמש יוכל להכניס 10 מספרים כשהוא אמור להכניס רק 3 למשל ואני לא אדע מזה.

ב. ברגע שהgetchar נתקל במספר הוא יזהה את זה כטעות. גם אם אני מוסיפה לו שקוד האסקי של ספרות מותר זה לא יעבוד טוב. דוגמא - רווח-מספר חד ספרתי-כוכבית-רווח-מספר הgetchar יקח את המספר החד ספרתי ואז ה%d יקפוץ למספר הבא ויתעלם מהשגיאה בקלט.

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

פורסם

קודם כל, למה להתעסק בכלל עם ascii? בשביל לבדוק אם תו שקראת הוא רווח את פשוט יכולה להשוות אותו לתו ' ', ובשביל לבדוק אם משהו הוא ספרה יש לך את הפונקציה הסטנדרטית isdigit.

לא הבנתי איך את אמורה לזהות מתי המשתמש סיים להכניס קלט. האם בסוף השורה? אם כן, אז את פשוט יכולה לבדוק אם התו שקראת הוא 'n\' (תו שמציין סוף שורה).

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

פורסם
  • מחבר

אוקיי, טעות שלי - מותר לנו להשתמש רק בספריית stdio.h ורק בפקודות ספציפיות ממנה כמו סקן ופרינט. אני לא בטוחה איזה עוד פקודות יוצאות מהספרייה הזו, אבל בעיקרון הם מצפים שאת רוב העבודה נעשה בעזרת מערכים ולולאות. הפונקציה isdigit אסורה אצלנו כרגע.

אם יש לך מקור טוב לקרוא ממנו אני אשמח לקישור. בינתיים גוגל לא כל כך עוזר לי (כנראה כי אני לא כל כך יודעת מה אני מחפשת). תודה.

פורסם

אין isdigit ? אז כותבים isdigit.

קוד ASCII הוא סך הכל מספר 8 ביטים. כשאת כותבת 'a' הקומפיילר רואה 97 ( 01100001 ). תתעלמי לשניה

מהעצה של שניצל, לכי לכאן ותסתכלי איפה נמצאות הספרות 0-9.

לגבי שאר הקוד, לדעתי את חושבת יותר מדי low level.

ככה אני רואה את זה בראש:

[1] את צריכה לבדוק תווים בקלט, עד ש(א->1) סוף שורה או (ב->4) תוו לא חוקי, נכון?

(ג->2) ברגע שאת רואה ספרה, את מתחילה להרכיב מספר.

(ד->1) רווחים לא חשובים, אפשר לדלג.

[2] (א->2) אם התו הבא הוא ספרה, אפשר להניח שהוא חלק מהמספר, נכון?

(ב->4) תו לא חוקי, ואנחנו בחוץ.

(ג->1) מה עוד? מה עוד? אה כן... רווח. רווח זה סוף המספר הנוכחי, אפשר לאחסן אותו, וסיימנו איתו.

[3] סוף הקלט.

[4] שגיאה.

המספרים בסוגריים המרובעים ( [1] ... [4]) אלה המצבים שלך. האותיות עם החץ (א->1 ...) מסמלות תנאי והחץ (->) מראה

את המצב שאליו הקוד קופץ. כלומר א->1 אפשר לקרוא כ: אם "א" מתקיים לך ל 1.

זהו, מקווה שלא סיבכתי את זה יותר מדי, נסיתי לא להשתמש במונחים טכניים. ועכשיו שאני מסתכל על זה, לא בטוח שזה עזר :)

פורסם
  • מחבר

דווקא עזרת מאוד, אחלה הכוונה. עכשיו יש לי בראש פחות או יותר מה צריך לעשות, אני אשב על הלולאות בעברית ואח"כ אעביר לשפת סי. תודה רבה :)

ארכיון

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

דיונים חדשים