עבור לתוכן

צריך עזרה עם קליטת מחרוזת - שפת C

Featured Replies

פורסם

אהלן.

יש לי שאלה ואשמח אם תוכלו לעזור לי...

האם יש דרך לקלוט מהמשתמש מחרוזת ב-C ללא שימוש במערך?

אני לא מדבר על תו (אנטר), ואז עוד תו (אנטר), ואז עוד תו (אנטר) וכו'... אלא על מחרוזת של נניח שש-שבע ספרות.

תודה ושבוע טוב!

פורסם

מחרוזת בהגדרה זה מערך. אם אתה רוצה לשמור איפשהו את המחרוזת אתה חייב להשתמש במערך.

אם מדובר במחרוזת של ספרות, אז בעצם מדובר במספר - אז אתה פשוט להשתמש ב-(scanf("%d", &x או לחילופין לקלוט ספרה-ספרה באמצעות getchar ולבנות את המספר בעצמך (באמצעות פעולות חיבור וכפל).

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

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

פורסם
  • מחבר

היי שניצל.

תודה על העזרה.

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

לא אכפת לי להשתמש ב-(scanf("%d", &x -גם זה טוב מבחינתי - כל עוד יש לי דרך לבדוק את הקלט:

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

בכל אופן, הקלט:

6585482 חוקי.

23a665 לא חוקי (מכיל תו a).

3559- לא חוקי (מכיל תו שאינו ספרה).

וכו'...

יש דרך להיעזר איכשהו בלולאה כדי לאחסן קלט בלי שהמשתמש הקיש Enter? (כך אוכל לבדוק את תקינות הקלט תוך כדי הקלדה)

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

פורסם

לדעתי אתה מסבך את עצמך שלא לצורך. אני מניח שאתה עובד ב CONSOLE, ואם אה רושם 234A עושה מחיקת אות ומשנה ל 2345 זה קלט חוקי, אבל אתה תצטרך לעשות הרבה מניפולציות כדי לטפל בזה. אם אתה עובד מול חלון WIN זה הרבה יותר פשוט, יש לך מאורע של שינוי שיקפוץ בכל פעם שמשנים משהו ואז אתה יכול לבצע את התוכנית שלך.

פורסם
  • מחבר

היי yigael_o.

תודה על התגובה.

חיים קשים זה הדבר האחרון שאני מחפש לעצמי, תאמין לי.

פשוט אלה דרישות התרגיל שקיבלתי - לוודא שהקלט הוא ספרתי, ולעשות זאת ללא מערך.

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

פורסם

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

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

אין שום בעיה לכתוב רצף של ספרות ואז Enter, ואז כל קריאה ל-getchar תקרא תו אחד מהקלט (בלי לדלג על שום דבר). אתה יכול לזהות שהקלט הסתיים ע"י זה שקראת תו ירידת שורה ('n\').

פורסם
  • מחבר

סלח לי על הבורות, אבל עדיין לא ירדתי לסוף דעתך.

מה אתה בעצם מציע?

האם תוכל בבקשה לכתוב שורת קוד שתבהיר למה אתה מתכוון?

תודה.

פורסם

תראה את דוגמת השימוש ב-getchar כאן:

http://www.cplusplus.com/reference/cstdio/getchar

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

פורסם
  • מחבר

שניצל, י'תותח.

הרצתי את הקוד, ונראה לי שאצליח להתאים את זה לדרישות.

תודה.

פורסם
  • מחבר

אני אוסיף רק שאלה שמעניינת אותי (לגבי הקוד אליו הפנת אותי):

איפה בדיוק getchar מאחסנת את כל התווים שנקלטים?

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

פורסם

מערכת ההפעלה מנהלת את העסק הזה. כשאתה מקליד בקונסולה, מערכת ההפעלה דואגת לשמור את מה שהקלדת בחוצץ (buffer, דהיינו קטע בזכרון) ומסמנת שיש קלט שמחכה להיקרא. הפונקציה getchar (וכל שאר הפונקציות שקוראות מהקלט) בודקת אם יש קלט שמחכה להיקרא, ואם כן אז היא קוראת תו בודד מהחוצץ הזה, ומחזירה אותו. אם אין עוד קלט שמחכה להיקרא (כלומר החוצץ כולו כבר נקרא) אז הפונקציה מחכה עד שמערכת ההפעלה תסמן שיש עוד קלט.

(מעשית מערכת ההפעלה היא שמנהלת את כל העסק, ו-getchar רק מפעילה פונקציה מסויימת של מערכת ההפעלה שעושה את הבדיקה והקריאה מהחוצץ שתיארתי)

פורסם
  • מחבר

:xyxthumbs:

תודה אחי. עזרת לי מאוד.

ארכיון

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

דיונים חדשים