שפת C/פלט וקלט


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


כדאי לדעת:

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

<include <stdio.h# כפי שראינו בשורה 1 של שלום עולם.

פונקציית הפלט printf עריכה

אחת הפונקציות החשובות ביותר בשפת C היא printf, המאפשרת להדפיס הודעות על מסך המחשב לפי תבנית (format באנגלית) נתונה (ומכאן שמה, print format).

הדפסת הודעות קבועות עריכה

printf מאפשרת להדפיס הודעות קבועות (כפי שכבר ראינו). לדוגמה, כדי להציג Hello world, אפשר לכתוב:

printf("Hello world");


הדפסת ערכים בעזרת מציינים עריכה

printf מאפשרת גם להדפיס ערכי משתנים. לדוגמה, אם x הוא משתנה מטיפוס שלם, אז קטע הקוד הבא:

printf("the value is %d", x);

ידפיס the value is ולאחריו הערך ב-x. כלומר, רצף התווים %d משמעו כאן מציין שיש להדפיס ערך מטיפוס שלם.


 

עכשיו תורכם:

דרגת קושי:

☆ ☆ ☆ ★

כתבו תוכנית שבה תשימו את גילכם למשתנה, ואז תדפיסו הודעה לגביו.


#include <stdio.h>

int main()
{
int age = 16;

printf("my age is %d\n", age);
}


אם רוצים להדפיס ערך שאינו דווקא מטיפוס שלם, יש להחליף את רצף התווים %d ברצף שמתאים לטיפוס:

  • d% עבור טיפוסים מסוג int
  • ld% עבור טיפוסים מסוג long int
  • c% עבור טיפוסים מסוג char
  • f% עבור טיפוסים מסוג float
  • u% עבור טיפוסים מסוג unsigned
  • lf% עבור טיפוסים מסוג double
  • L% עבור טיפוסים מסוג long double
  • e% כדי להדפיס מספרים בתצוגת נקודה צפה, כלומר 1000 יודפס כ-1e3, ו- 0.001 יודפס 1e-3, וכן הלאה. נוח לעבודה עם מספרים גדולים או קטנים במיוחד.
  • s% עבור מחרוזות (שטרם למדנו בנקודה זו)
  • p% עבור מצביעים (שטרם למדנו בנקודה זו)


הפונקציה printf אף מאפשרת להדפיס יותר מערך יחיד. להדפסת שני ערכים, לדוגמה, אפשר לכתוב:

printf("the values are %d %d", x, y);


 

כדאי לדעת:

שפת C גם כוללת מספר תווים מיוחדים, לדוגמה התו '\n' שהוא התו ירידת שורה (כלומר, סיום השורה הנוכחית ומעבר לשורה חדשה). לדוגמה, הקריאה הבאה:
printf("Hello world\n");

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

דגלים, קובעי רוחב ודיוק עריכה

 

שקלו לדלג על נושא זה

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



עד עתה השתמשנו במציינים כך:

%<specifier>

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


קובעי רוחב עריכה

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

%[width]<specifier>

כאשר specifier הוא המציין, וwidth הוא קובע הרוחב.

אם width הוא מספר, אז הדפסת הערך תיקח לכל הפחות width תווים. לדוגמה:

printf("%10d", 3);

תדפיס:

            3

כך מאפיינים גם רוחב הדפסה למחרוזות. לדוגמה:

printf("%10s", "Hello");

תדפיס:

       Hello

קובעי דיוק עריכה

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

%[.precision]<specifier>

כאשר specifier הוא המציין, וprecision הוא קובע הדיוק.

אם precision הוא מספר, אז דיוק המספר יהיה בדיוק precision תווים. לדוגמה:

printf("%.3f\n", 3.14159265);
printf("%.3f\n", 3.1);

ידפיסו:

3.142
3.100

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

printf("%.3s\n", "Hello");

תדפיס:

Hel


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

%[width][.precision]<specifier>

במקרה כזה, קודם יופעל קובע הדיוק, ולאחריו קובע הרוחב. לדוגמה:

printf("%10.3f\n", 3.14159265);
printf("%10.3f\n", 3.1);
printf("%10.3s\n", "Hello");

ידפיסו:

     3.142
     3.100
       Hel


דגלים עריכה

לפני המציין, אפשר אופציונאלית לכתוב גם דגלים, כך:

%[flags]<specifier>

כאשר flags הם דגלים, וspecifier הוא מציין.

הדגלים הם:

דגל משמעות
- במקרה שצויין קובע רוחב, והערך המודפס צר יותר, הצמד לצד שמאל (ברירת המחדל הוא צד ימין).
+ הצמד לפני מספרים חיוביים את התו '+' (ברירת המחדל היא לכתוב מספרים חיוביים ללא סימן).
(רווח) הצמד לפני מספרים חיוביים את התו ' '.
# הוסף עוד תווים לאחידות פלט, לדוגמא התו '.' לאחר מספרי נקודה צפה שערכם שלם.
0 במקרה שצויין קובע רוחב, והערך המודפס צר יותר, כתוב אפסים משמאל למספר.


אפשר להשתמש בו זמנית בדגלים, קובעים, ומציינים, בצורה הבאה:

%[flags][width][.precision]<specifier>

פונקציות הקלט scanf עריכה

בת זוגה של printf היא scanf, המאפשרת לקלוט ערכים לפי פורמט נתון.

קליטת ערכים בעזרת מציינים עריכה

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

int x;

scanf("%d", &x);

כאשר התוכנית תגיע לשורה זו, היא תמתין עד שהמשתמש יקליד מספר וילחץ Enter. המספר ייקלט למשתנה x.


 

כדאי לדעת:

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


באותו האופן, נוכל לקלוט מספר משתנים מסוגים שונים:

int number;
char first_letter;
int phone;

printf("Please enter a number, first character of your name, and your phone number:\n");
scanf("%d %c %d", &number, &first_letter, &phone);

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

קובעי רוחב עריכה

 

שקלו לדלג על נושא זה

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



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

%[width]<specifier>

כאשר specifier הוא המציין, ו-width הוא קובע הרוחב.

אם width הוא מספר, אז ייקלטו לכל היותר width תווים. לדוגמה:

scanf("%3d", &num)

תקלוט לכל היותר 3 תווים. כך מאפיינים גם רוחב קליטה למחרוזות. לדוגמה:

  char a[5];
  
  scanf("%4s", a);

תקלוט לכל היותר 4 תווים למחרוזת a.

קליטת מחרוזות קבועות עריכה

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

int x, y;

scanf("%5d %5d", &x, &y);

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

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

int x, y;

scanf("%5d,%5d", &x, &y);

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

נוכל להכליל זאת:

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

פונקציות פלט/קלט נוספות עריכה

בנסוף לפונקציות printf ו-scanf ישנן עוד פונקציות לקלט ופלט:


הפרק הקודם:
משתנים
פלט וקלט
תרגילים
הפרק הבא:
פעולות חשבוניות