עבור לתוכן

scanf איך ניתן לקרוא 4 char מבלי לקפוץ שורה

Featured Replies

פורסם

אני כתבתי כך

scanf("%d%d%d%d",&num1,&num2,&num3,&num4); ok

ואחרי כל פעם שאני מכניס ערך DOS קופץ שורה איך אני יכול למנוע זאת

פורסם

מה בדיוק אתה מצפה שייקרה?

שתכניס 4 תוים ואז ייקרה משהו?

אם כן - אז נראה לי שעדיף לך להשתמש בפונקציות כמו getch() (או getch או getche, אני אף פעם לא זוכר) שמחכות לתו אחד כל פעם.

פורסם

שתי הפונקציות- getch() ו-getche() למעשה קוראות תו אחד בכל פעם רק שאני עדיין לא מבין מה ההבדל... :nixweiss:

פורסם

E מציג על המסך את התו שנקלט. בלי E לא.(ECHO)

מופרה, שים לב שאתה צריך להכניס את התו בלבד ללא ENTER אחריו.

פורסם

אל תחליף שום פונקצייה פשוט תכניס תנתונים בשורה

כאילו נתון רווח נתון רווח נתון רווח נתון

ורק אז אנתר וזהו

פורסם
  • מחבר

שתי הפונקציות- getch() ו-getche() למעשה קוראות תו אחד בכל פעם רק שאני עדיין לא מבין מה ההבדל... :nixweiss:

אסור לי להשתמש בשום פונקציה מתוך <CONIO.H> והנה השאלה שנתנו לנו

שאלה 2

כתבו תוכנית שקולטת שני מספרים שלמים חיוביים. המספרים מורכבים מ- 4 ספרות כל אחד. את המספר הראשון התוכנית קוראת על-ידי קריאה אחת לפונקציה scanf. התוכנית תפרק את המספר הראשון לספרות בודדות ותדפיס את ארבע הספרות עם רווח אחד בין כל שתי ספרות. את המספר השני התוכנית קוראת על-ידי ארבע קריאות לפונקציה scanf: כל קריאה קוראת ספרה אחת כערך מטיפוס - char. לאחר שכל ארבע הספרות של המספר השני נקראו, התוכנית תחשב את המספר מארבע הספרות הנ"ל.

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

לדוגמא:

C:\> Hw1_q2

Please enter number: 1234

Please enter another number: 7654

The numbers are: 1 2 3 4 and 7654

- הגישו את תוכניתכם ואת הפלט (בפורמט לעיל) עבור הקלטים הבאים:

1234 ו- 7654

4523 ו- 8502

8750 ו- 7398

הערות:

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

רמז:

את המספר 1234 ניתן לחשב מספרותיו על-ידי הנוסחה הבאה: 1*1000 + 2*100 + 3*10 + 4

פורסם

אסור לי להשתמש השום פונקציה מתוך <CONIO.H>

אבל getch() ו-getche() נמצאות בכלל ב-stdio.h... :nixweiss:

פורסם

אבל getch() ו-getche() נמצאות בכלל ב-stdio.h... :nixweiss:

לא, הן נמצאות בCONIO.

לפותח התראד:

את המספר הראשון:

תקרא כ- INT, תבדוק את הMOD שלו עם 10, תדפיס, ואז תחלק את המספר ב- 10, ככה 4 פעמים.

עבור המספר השני:

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

בקיצור:


int n, i;
char s[5]; // for '\0'
printf("please enter the input bla bla: ");
scanf("%d%s", &n, s);
for(i=0;i<4 && n!=0;i++, n/=10)
printf("%d ", n%10);
printf(" was the first numer\n");

n=0;
for(i=0;s[i];i++)
n=n*10+s[i]-'0';
printf("%d is the second\n", n);

פורסם

אוי, Boomerang הוא הראשון שבלבל אותי.

תשתמש ב-getchar() שנמצאת ב-stdio.h והיא קוראת תו אחר תו.

getch() ו-getche() בכלל קוראות לחיצה במקלדת ואז יכול להיות מצב שאתה קולט בכלל נגיד את כפתור Tab... :nixweiss:

פורסם

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

פורסם
  • מחבר

מה הטעות פה?

#include <stdio.h>

int main()

{

int first,x;

char sec1,sec2,sec3,sec4;

printf("\nplease enter number ");

scanf("%d",&first);

printf("\nplease enter second number %d",first);

scanf("%d ",&sec1);

printf("%d old ",first);

נגיד אם אני מכניס לFIRST 1234 אני מקבל בקלט בשורה האחרונה 1024 למה? אם אני מוריד את הSCANF בשורה הלפני אחרונה הכל מסתדר אבל אני צריך את השורה הזו

פורסם

אתה משחק בחומר נפץ.

ל- scanf אתה צריך לתת משתנה מהסוג שאתה אומר לה לצפות לו.

אם אתה אומר לה שזה int (ע"י %d) ומעביר מצביע ל- char, אז היא תתייחס אליו כאל מצביע ל- int ותדרוס משתנים באיזור שלו, דבר שיכול לגם להעיף לך את התוכנית.

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

בקיצור - אתה רוצה לקרוא int - תעביר int, אתה רוצה לקרוא תו (%c נדמה לי), תעביר char.

פורסם

מה זה "המרת פוינטרים לא מיושרת"?

פורסם

משתנים בזיכרון יושבים בדר"כ בכתובות "עגולות" (כפולות של 4 או 8 בתים).

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

באופן דומה, אם אתה מגדיר 4 משתנים של char ברצף, יכול להיות שהקומפיילר ישים אתם ארבעתם באותו DWORD.

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

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

(היתה כאן דוגמא, אבל היא פשוט לא היתה נכונה)

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

פורסם
  • מחבר

תודה לכולם הצלחתי לעשות הכל :xyxthumbs:

ארכיון

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

דיונים חדשים