المتغيرات
فضاءات التسمية
أفعال

printf, fprintf, sprintf, snprintf, printf_s, fprintf_s

من cppreference.com
< c‏ | io

معرفة في ملف <stdio.h>
(1)
int printf( const char *format, ... );
(حتى C99)
int printf( const char *restrict format, ... );
(منذ C99)
(2)
int fprintf( FILE *stream, const char *format, ... );
(حتى C99)
int fprintf( FILE *restrict stream, const char *restrict format, ... );
(منذ C99)
(3)
int sprintf( char *buffer, const char *format, ... );
(حتى C99)
int sprintf( char *restrict buffer, const char *restrict format, ... );
(منذ C99)
int snprintf( char *restrict buffer, int bufsz,
              const char *restrict format, ... );
(4) (منذ C99)

تحمل البيانات من المواضع المحددة, وتحولها إلى سلسلة حروف ثم تخرج الناتج إلى مكان ما.

1) تكتب الناتج في تيار الإخراج القياسي stdout‎.
2) تكتب الناتج في تيار الإخراج ‎stream‎.
3) تكتب الناتج في المصفوفة ‎buffer‎. السلوك غير معرف حال كون المصفوفة ‎buffer‎ لا تكفي حجم الناتج (بما فيه حرف الـ ‎'\0'‎ في الآخر).
4) كتب الناتج في المصفوفة ‎buffer‎ . لا يتم كتابة أكثر من ‎bufsz‎ - 1 من الحروف يتم اضافة ‎'\0'‎ الى آخر المصفوفة مالم تكن ‎bufs‎ بصفر.

محتويات

[تعديل] المعطيات

stream - تيار الإخراج الذي ستتم فيه الكتابة
buffer - مؤشر إلى سلسلة من الحروف منتهية بـ‎'\0'‎ ستتم الكتابة فيها
bufsz - الحد الأقصى لعدد الحروف التي ستكتب شاملة ‎'\0'
format - مؤشر إلى سلسلة من الحروف منتهية بـ‎'\0'‎ تبين كيفية فهم المعطيات

. تتكون سلسلة التنسيق (format string) من حروف عادية (عدا %) يتم نسخها بدون تعديل إلى تيار الإخراج ومن علامات تحويل. كل علامة تحويل تكون على الهيئة الآتية:

  • حرف % ابتدائي
  • (اختياري) علامة أو أكثر تغير من سلوك التحويل
  • -: يتم المحازاة ناحية اليسار داخل المكان المتاح (في العادة تكون المحازاة جهة اليمين)
  • +: يتم إظهار إشارة الأعداد ذات إشارة حتى لو كانت موجبة (في العادة لا تتم طباعة الإشارة إلا للأعداد السالبة)
  • (مسافة): يتم وضع مسافة في الموضع المفترض للإشارة الموجبة. يتم تجاهل هذه العلامة في حال وجود +.
  • #: يتم إجراء تحويل بديل. أنظر الجدول لمزيد من التفاصيل.
  • 0: في تحويلات الأعداد الصحيحة وذات الفاصلة العائمة يدل الصفر على الشمال على أنه يلزم استخدام أصفار بدلا من مسافات لملء الفراغ عند المحازاة. سلوك استخدام العلامة مع تحويلات أخرى غير معرف. يتم تجاهل العلامة إذا كان العدد فاصلة عائمة ومحدد صراحة الدقة المطلوبة أو إذا وجدت علامة ‎-‎.
  • (اختياري) عدد صحيح أو ‎*‎ تحدد أقل سعة لممكان العرض. تتم المحازاة دخل المكان باستخدام مسافات. في حالة استخدام ‎*‎ يتم قراءة الإزاحة من معطى إضافي من النوع int. اذا كان المعطى سالبا يتم ادراج العلامة ‎-‎ واعتبار الازاحة عددا موجبا.
  • (اختياري). متبوعة بعدد صحيح أو * تحدد دقة التحويل. في حالة استخدام ‎*‎ يتم قراءة الدقة من معطى إضافي من النوع int. اذا كان المعطى سالبا يتم تجاهله. انظر الجدول بالأسفل لكامل التفاصيل بخصوص الدقة.
  • (اختياري) طول المدخل يحدد طول المعطى
  • نوع التحويل (conversion format specifier)

توجد الأنواع التالية من التحويلات:

نوع
التحويل
الشرح نوع المعطى
طول المدخل ‎hh‎ ‎h‎ بدون l ll j z t L
‎%‎ تكتب الرمز %. هذه هي الصيغة الكاملة: ‎ %%. غ\م غ\م غ\م غ\م غ\م غ\م غ\م غ\م غ\م
‎c‎
تكتب حرف وحيد.

يتم تحويل المعطى إلى unsigned char. عند استعمال الطول l يتم تحويل المعطى بنفس شروط ‎%ls‎ مع معط من النوع ‎wchar_t[2]‎.

غ\م غ\م
int
wint_t
غ\م غ\م غ\م غ\م غ\م
‎s‎
تكتب سلسلة حرفية

يجب أن يكون المعطى مؤشر على أول عنصر في مصفوفة الحروف. الدقة تحدد الحد الأقصى من الحروف التي ستكتب. في حالة عدم تحديد الدقة يتم كتابة كل الحروف حتى الوصول إلى حرف ‎'\0'‎) ‎'\0'‎ لا تكتب). عند استعمال الطول l يجب ان يكون المعطى مؤشر على أول عنصر في مصفوفة نوعها wchar_t. يتم تحويل هذه المصفوفة إلى مصفوفة حروف ضيقة باستخدام wcrtomb‎.

غ\م غ\م
char*
wchar_t*
غ\م غ\م غ\م غ\م غ\م
‎d‎
‎i‎
تحول a signed integer إلى الصورة الرقمية العشرية ‎[-]dddd‎.

الدقة تعبر عن أصغر عدد من الأرقام يجب كتابتها الدقة الاعتيادية هي 1.
إذا كانت كل من القيمة المحولة والدقة تساوي 0 تكون نتيجة التحويل خالية

signed char
short
int
long
long long
intmax_t
signed size_t
ptrdiff_t
غ\م
‎o‎
تحول a unsigned integer إلى الصورة الرقمية الثمانية oooo.

الدقة تعبر عن أصغر عدد من الأرقام يجب كتابتها الدقة الاعتيادية هي 1. إذا كانت كل من القيمة المحولة والدقة تساوي 0 تكون نتيجة التحويل خالية في التحويل البديل يتم دائما كتابة صفر على الشمال دلالة على أن العدد octal. في حالة أن المعطى صفر يتم كتابة '0' واحدة.

unsigned char
unsigned short
unsigned int
unsigned long
unsigned long long
uintmax_t
size_t
unsigned version of ptrdiff_t
غ\م
‎x‎
‎X‎
تحول unsigned integer إلى الصورة الرقمية الستةعشرية hhhh.

عند استخدام التحويل x يتم استعمال الحروف ‎abcdef‎ .
عند استخدام التحويل X يتم استعمال الحروف ‎ABCDEF‎ .
الدقة تعبر عن أصغر عدد من الأرقام يجب كتابتها الدقة الاعتيادية هي 1. إذا كانت كل من القيمة المحولة والدقة تساوي 0 تكون نتيجة التحويل خالية في التحويل البديل يتم كتابة 0x أو 0X أمام العدد المحول مالم يساوي الصفر.

غ\م
‎u‎
تحول an unsigned integer إلى الصورة الرقمية العشرية dddd.

الدقة تعبر عن أصغر عدد من الأرقام يجب كتابتها الدقة الاعتيادية هي 1. إذا كانت كل من القيمة المحولة والدقة تساوي 0 تكون نتيجة التحويل خالية

غ\م
‎f‎
‎F‎
تحول floating-point number إلى الصورة الرقمية العشرية على هذه الشاكلة: ‎[-]ddd.ddd‎.

الدقة تحدد أقل عدد يجب كتابته بعد الفاصلة العشرية. الدقة الاعتيادية هي 6. في التحويل البديل يتم كتابة الفاصلة بغض النظر عن وجود جزء كسري. بالنسبة لـقيم infinity و NaN أنظر الملحوظات.

غ\م غ\م
double
double
غ\م غ\م غ\م غ\م
long double
‎e‎
‎E‎
تحول floating-point number إلى الصورة الأسية العشرية.

عند استخدام التحويل e يتم استعمال الصيغة‎ [-]d.ddde±dd .
‎ عند استخدام التحويل E يتم استعمال الصيغة‎ [-]d.dddE±dd .
‎ الجزء الأسي يكون ذو رقمين على الأقل وربما يزيد عن ذلك عند الحاجة. إذا كان المعطى صفر يكون الأس صفر كذلك. الدقة تحدد أقل عدد يجب كتابته بعد الفاصلة العشرية. الدقة الاعتيادية يتم اختيارها بحيث تكفي للتعبير عن العدد دون تقريب. في التحويل البديل يتم كتابة الفاصلة بغض النظر عن وجود جزء كسري. بالنسبة لـقيم infinity و NaN أنظر الملحوظات.

غ\م غ\م غ\م غ\م غ\م غ\م
‎a‎
‎A‎
تحول floating-point number إلى الصورة الأسية الستةعشرية.

عند استخدام التحويل a يتم استعمال الصيغة ‎[-]0xh.hhhp±d .
‎ عند استخدام التحويل A يتم استعمال الصيغة ‎[-]0Xh.hhhP±d .
‎ The first hexadecimal digit is ‎0‎ if the argument is not a normalized floating point value. عند استعمال الطول value is 0, the exponent is also 0. الدقة تحدد أقل عدد يجب كتابته بعد الفاصلة العشرية. الدقة الاعتيادية يتم اختيارها بحيث تكفي للتعبير عن العدد دون تقريب. في التحويل البديل يتم كتابة الفاصلة بغض النظر عن وجود جزء كسري. بالنسبة لـقيم infinity و NaN أنظر الملحوظات.

غ\م غ\م غ\م غ\م غ\م غ\م
‎g‎
‎G‎
تحول floating-point number to decimal or decimal exponent notation depending on the value and the precision.

عند استخدام التحويل g يتم استعمال الصيغة conversion with style e or f will be performed.
عند استخدام التحويل G يتم استعمال الصيغة conversion with style E or F will be performed.
Let ‎P‎ equal the precision if nonzero, 6 if the precision is not specified, or 1 if the precision is 0. Then, if a conversion with style ‎E‎ would have an exponent of ‎X‎:

  • if P > X ≥ −4, the conversion is with style f or F and precision P − 1 − X.
  • otherwise, the conversion is with style e or E and precision P − 1.

Unless alternative representation is requested the trailing zeros are removed, also the decimal point character is removed if no fractional part is right. For infinity and not-a-number يتم استعمال الصيغة see notes.

غ\م غ\م غ\م غ\م غ\م غ\م
‎n‎

تُرجع عدد الحروف المكتوبة حتى الآن جراء الإستدعاء الحالي.

يتم كتابة الناتج بداخل الكائن المشار إليه من قبل المعطى.

هذه هي الصيغة الكاملة: ‎ %n.

ملحوظة: الكثير من الكومبيلرات لا تطبق هذه التحويلة لدواعي أمنية.

signed char*
short*
int*
long*
long long*
intmax_t*
signed size_t*
ptrdiff_t*
غ\م
‎p‎ تكتب سلسلة من الحروف تحددها البيئة تعبر عن مؤشر. غ\م غ\م void* غ\م غ\م غ\م غ\م غ\م غ\م
ملحوظات:

تحويلة الأعداد ذات الفاصلة العائمة تحول اللا نهاية الا كلمة ‎inf‎ أو ‎infinity‎. للبيئة حرية الإختيار بينهم.
Not-a-number يتم تحويلها إلى ‎nan‎ أو ‎nan(char_sequence)‎‎. للبيئة حرية الإختيار بينهم.
التحويلات F و E و G و A تطبع ‎INF‎ و ‎INFINITY‎ و ‎NAN‎ بدلا من ذلك.
رغم أن ‎‎%c‎ تتوقع ‎int‎ كمعطى, إلا أن إمرار ‎char‎ آمن لأنه يتم ترقيته إلى ‎int‎ بسبب وقعه في دالة variadic.
التحويلات الصحيحة للأنواع ثابتة الحجم (مثل int8_t‎ وغيره) معرفة في ملف <inttypes.h>.

... - المعطيات التي تحدد البيانات المراد كتابتها

[تعديل] القيمة المُرجعة

1,2) عدد الحروف التي تم ارسالها إلى تيار الإخراج أو قيمة سالبة في حالة حدوث خطأ في الكتابة أو الترميز (عند تحويل الحروف فقط)
3) عدد الحروف التي كتبت في ‎buffer‎ (لا يتم احتساب ‎'\0'‎ التي في النهاية) أو قيمة سالبة في حالة حدوث خطأ في الترميز (عند تحويل الحروف فقط)
4) عدد الحروف التي كانت ستكتب في ‎buffer‎ (لا يتم احتساب ‎'\0'‎ التي في النهاية) إذا لم تؤخذ ‎bufsz‎ في الاعتبار أو قيمة سالبة في حالة حدوث خطأفي الترميز (عند تحويل الحروف فقط)

[تعديل] ملحوظات

تحدد POSIX أنه يتم وضع قيمة 1 داخل errno‎ عند حدوث خطأ.


[تعديل] مثال

#include <stdio.h>
 
int main(void)
{
    printf("Strings:\n");
    const char* s = "Hello";
    printf("\t.%10s.\n\t.%-10s.\n\t.%*s.\n", s, s, 10, s);
 
    printf("Characters:\t%c %%\n", 65);
 
    printf("Integers\n");
    printf("Decimal:\t%i %d %.6i %i %.0i %+i %u\n", 1, 2, 3, 0, 0, 4, -1);
    printf("Hexadecimal:\t%x %x %X %#x\n", 5, 10, 10, 6);
    printf("Octal:\t%o %#o %#o\n", 10, 10, 4);
 
    printf("Floating point\n");
    printf("Rounding:\t%f %.0f %.32f\n", 1.5, 1.5, 1.3);
    printf("Padding:\t%05.2f %.2f %5.2f\n", 1.5, 1.5, 1.5);
    printf("Scientific:\t%E %e\n", 1.5, 1.5);
    printf("Hexadecimal:\t%a %A\n", 1.5, 1.5);
}

الخرج:

Strings:
    .     Hello.
    .Hello     .
    .     Hello.
Characters:     A %
Integers
Decimal:        1 2 000003 0  +4 4294967295
Hexadecimal:    5 a A 0x6
Octal:          12 012 04
Floating point
Rounding:       1.500000 2 1.30000000000000004440892098500626
Padding:        01.50 1.50  1.50
Scientific:     1.500000E+00 1.500000e+00
Hexadecimal:    0x1.8p+0 0X1.8P+0

[تعديل] أنظر أيضا

تكتب خرج الى stdout‎ أو تيار ملف (FILE*‎) أو مصفوفة
مستخدمة variable arguments list
(دالة) [edit]
تكتب سلسلة من الحروف إلى داخل تيار ملف.
(دالة) [edit]
تقرأ مدخل منسق من stdin‎ أو تيار ملف (FILE*‎) أو مصفوفة
(دالة) [edit]
مقالة مرجع C++‎ عن printf, fprintf, sprintf, snprintf