إنَّ الحَمْدَ لِلَّهِ نَحْمَدُهُ وَنَسْتَعِيُنُهُ وَنَسْتَغْفِرُهُ وَنَسْتَهْدِيهِ وَنَعُوذَ بِاللهِ مِن شُرُورِ أَنفُسِنَا وَسَيئَاتِ أَعْمَاِلَنَا،
مَن يَهْدهِ اللهُ فَلا مُضلَّ لَه ، وَمَن يُضْلِل فَلا هَادِي لَه، وَأَشْهَدُ أَنَّ لاَ إِلهَ إلا اللهُ وَحدَهُ لاَ شَريكَ لَهُ،
وَأَشْهدُ أنَّ مُحَمَّداً عَبدُهُ وَرَسُولُهُ .
اليوم سوف أتتطرق الي طريقة استعمال تعدد البرامترات أو ما يسمي ب variable arguments
وسف ننشأ دالة جديدة تقوم بعمل الدالة printf
وسوف نعطيها في كل مرة أنواع من البرامترات
وسوف أشرح هده الدوال وأنواع
va_list
()va_start
()va_arg
()va_end
أولا ننشئ مشروع جديد ولا ننسي أن نستدعي الملف الراسي stdarg.h
وننشئ دالة من نوع void وأنا سميتها Myprintf
وأعطيتها برامتر الاول وهو فورمات المتغيرات المراد طباعتها متل d% ...
#include <stdio.h>
#include <stdarg.h>
void Myprintf(char *frmt,...)
{
}
main()
{
getchar();
return 0;
}
#include <stdlib.h>
تم نقوم بانشاء مغيرات جديدة :
Mylist وهي التي يخزن فيها البرامترات التي سوف نضعها عند استدعاء دالتنا الجدية...وهي من نوع va_list
value وهو الدي سوف يقوم بأخد قيمة الفورمات frmt وسوف يأخد حرف يحرف منه
cval:وهو المتغير الدي سيأخد قيمة البرامتر من نوع string الدي سنمرره في دالتنا
ival : وهو المتغير الدي سيأخد قيمة البرامتر من نوع int الدي سنمرره لها عند استدعاء دالتنا
ونفس الشي مع fval
#include <stdio.h>
#include <stdarg.h>
void Myprintf(char *frmt,...)
{
va_list Mylist;
char *value,cval;
int ival;
float fval;
}
main()
{
getchar();
return 0;
}
#include <stdlib.h>
تم نقوم باستدعاء دالة بدأ الحصول علي البرامترات ألا وهي va_start
التي تأخد برامرين واحد va_list والا خر هو أخر برامتر معروف لديانا وهو frmt
وتم نقوم بانهاء الحصول عليها باستعمال va_end
#include <stdlib.h>
#include <stdio.h>
#include <stdarg.h>
void Myprintf(char *frmt,...)
{
va_list Mylist;
char *value,cval;
int ival;
float fval;
va_start(Mylist,frmt);
va_end();
}
main()
{
getchar();
return 0;
}
تم نقوم بالتكرار طالما value=frmtو نزيد في قيمة value ليشير دائما الحرف الموالي
وطالما قيمة value تخالف نهاية السلسلة \0
#include <stdio.h>
#include <stdarg.h>
void Myprintf(char *frmt,...)
{
va_list Mylist;
char *value,cval;
int ival;
float fval;
va_start(Mylist,frmt);
for(value=frmt;*value;value++)
{
}
va_end();
}
main()
{
getchar();
return 0;
}
#include <stdlib.h>
تم نقوم بوضع شرط ادا كان قيمة value ليست % يعني أننا نريد طباعة ما نريد
أعطيك متال عندما تكتب هكدا
printf("%d years old\n",18);فهل يتم طباعة years old نعم ولكن لا يتم طباعة d%
لانها تشير الي 18 وهدا هو غرض هدا الشرط ادا كان قيمة value لا تشير الي برامتري ما فقم بطباعة دلك
وقم بقفز التالي وابدأ من جديد
continue
#include <stdio.h>
#include <stdarg.h>
void Myprintf(char *frmt,...)
{
va_list Mylist;
char *value,cval;
int ival;
float fval;
va_start(Mylist,frmt);
for(value=frmt;*value;value++)
{
if(*value!='%')
{
putchar(*value);
continue;
}
}
va_end();
}
main()
{
getchar();
return 0;
}
#include <stdlib.h>
تم نقوم بشروط أخي عن طريق أستخدام switch
وهده الشروط سوف تكون عبارة عن ادا كانت قيمة value*... تم نزيد قيمته في كل مرة لأخد الحرف الدي بعد %
#include <stdio.h>
#include <stdarg.h>
void Myprintf(char *frmt,...)
{
va_list Mylist;
char *value,cval;
int ival;
float fval;
va_start(Mylist,frmt);
for(value=frmt;*value;value++)
{
if(*value!='%')
{
putchar(*value);
continue;
}
switch(*++value)
{
}
}
va_end();
}
main()
{
getchar();
return 0;
}
#include <stdlib.h>
تم نقوم بمعالجة قيمة value ادا كانت i يعني int فقم وضع قيمة البرامتر التالي الدي هو من نوع int في المتغير ival
باستعمال الدالة va_arg
وقم بطباعته ونفس الشئ مع s و f
وادا كانت القيمة غير معروفة فقم فقط بطباعة قيمته default
#include <stdio.h>
#include <stdarg.h>
void Myprintf(char *frmt,...)
{
va_list Mylist;
char *value,cval;
int ival;
float fval;
va_start(Mylist,frmt);
for(value=frmt;*value;value++)
{
if(*value!='%')
{
putchar(*value);
continue;
}
switch(*++value)
{
case 's':
cval=va_arg(Mylist,char*);
puts(cval);
break;
case 'f':
fval=va_arg(Mylist,double);
printf("%f",fval);
break;
case 'i':
ival=va_arg(Mylist,int);
printf("%d",ival);
break;
default:
putchar(*value);
break;
}
}
va_end();
}
main()
{
getchar();
return 0;
}
#include <stdlib.h>
الان دعونا نجرب دالتنا الجديدة : نقوم بانشاء متغيرين من نوع string و int
تم نقوم بطباعتهما كما يلي:
#include <stdlib.h>
#include <stdio.h>
#include <stdarg.h>
void Myprintf(char *frmt,...)
{
va_list Mylist;
char *value,cval;
int ival;
float fval;
va_start(Mylist,frmt);
for(value=frmt;*value;value++)
{
if(*value!='%')
{
putchar(*value);
continue;
}
switch(*++value)
{
case 's':
cval=va_arg(Mylist,char*);
puts(cval);
break;
case 'f':
fval=va_arg(Mylist,double);
printf("%f",fval);
break;
case 'i':
ival=va_arg(Mylist,int);
printf("%d",ival);
break;
default:
putchar(*value);
break;
}
}
va_end();
}
main()
{
int age=18;
char *str="Years old";
Myprintf("Hi I'm %i %s",age,str);
getchar();
return 0;
}


