-
توابع ورودي خروجي رشته ها
در زبان C توابع متعددي وجود دارند كه در مورد رشته ها استفاده مي شوند .
اكثر اين توابع براي خواندن رشته ها از صفحه كليد و يا چاپ آنها در صفحه نمايش
بكار مي روند .
تابع ()gets
تابع ()gets براي خواندن رشته هااز صفحه كليد بكارميرود و بصورت زير استفاده
مي شود :
(متغير رشته اي )gets
مثال 1: main)(
{
char fname[21] ;
printf("enter your name: " );
gets(fname );
printf("\nyour name is : %s"/fname);
}
نمونه اي از خروجي برنامه مثال 1 : enter your name : bahrami
your name is : bahrami
شايد اين پرسش مطرح شود " با وجود تابع ()scanf كه مي تواند براي رشته ها و
متغيرهاي عددي استفاده شود چه لزومي دارد از تابع ()gets استفاده گردد " ? در
پاسخ به اين پرسش بايد گفت كه تابع ()scanf رشته ها را پيوسته در نظر مي گيرد .
يعني اگر در بين يك رشته ، از فاصله (blank) و يا tab استفاده شود ، از اين
كاراكترها ( فاصله و يا tab ) به بعد ، بعنوان رشته ديگري منظور ميشوند ( مثال 2
) . براي رفع اين اشكال مي توان از تابع ()gets استفاده نمود .
مثال 2: main)(
{
char name[21] ;
printf("enter your name family:");
scanf("%s"/gets(name );
printf("\n your name is : %s"/name );
}
نمونه اي از خروجي برنامه مثال 2 : enter your name : einollah jafarnezhad
your name is : einollah
همانطوري كه از خروجي برنامه پيداست ، در پاسخ به درخواست برنامه نام و نام
خانوادگي Einollah jafarnezhad را وارد نموده ايم كه چون بين نام و نام خانوادگي
فاصله افتاده است فقط نام (Einollah) در متغير name قرار گرفته و در خروجي چاپ
شده است ولي نام خانوادگي از دست رفته است . اگر بجاي scanf از تابع gets
استفاده شود اين مشكل پيش نخواهد آمد ، زيرا در ()gets فقط كليد enter ، جدا
كننده است .
تابع ()puts
اين تابع براي انتقال يك رشته به خروجي بكار مي رود و بصورت زير استفاده
مي شود .
(عبارت رشته اي )puts
هنگام استفاده از تابع puts، مي توان از يك متغير رشته اي و يا يك رشته ( كه
در داخل نقل قول (") باشد ) بجاي عبارت رشته اي استفاده كرد .
مثال 3: برنامه اي كه دو رشته را از ورودي خوانده و سپس محتويات يك رشته را
به رشته ديگر منتقل مي كند . طول هاي دو رشته ورودي مي توانند با يكديگر برابر
نباشند .
ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ main)(
{
char s1[81]/ s2[81] ;
int i / j ;
char temp ;
puts("enter string : " );
gets(s1 );
puts("enter string : " );
gets(s2 );
for(i=0 ; s1[i] && s2[i] ; i++)
{
temp=s1[i] ;
s1[i]=s2[i] ;
s2[i]=temp ;
}
if(s1[i])
{
j=i ;
while(s1[i])
s2[i]=s1[i++] ;
s2[i]\'\0' ;
s1[i]\'\0' ;
}
else if( s2[i])
{
j=i ;
while(s2[i])
s1[i]=s2[i++] ;
s2[i]\'\0' ;
s1[i]\'\0' ;
}
puts("new content of s1 is:" );
puts(s1 );
puts("new content of s2 is:" );
puts(s2 );
}
نمونه اي از خروجي برنامه مثال 3 : enter string :
first string
enter string :
second string
new content of s1 is:
second string
new content of s2 is:
first string
مثال 4: برنامه اي كه با خواندن يك رشته و دو كاراكتر از ورودي ، كاراكتر اول
را با كاراكتر دوم در سرتاسر رشته جايگزين مي كند . main)(
{
char string[50] ;
char source_letter/target_letter ;
int i ;
printf("\n enter the string :" );
gets(string );
printf("\n enter source character:" );
source_lette=getche )(;
printf("\n enter target character:" );
target_letter=getche )(;
if(source_letter != target_letter)
for(i=0 ; string[i] ; i++)
if(string[i]==source_letter)
string[i]=target_letter ;
printf("\n result string is:\n");
puts(string );
}
نمونه اي از خروجي برنامه مثال 4 : enter the string : in the name of allah.
enter source character: a
enter target character: A
result string is:in th
-
آرايه اي از رشته ها
گاهي ممكن است ، به عنوان مثال بخواهيم تعدادي از نام افراد را در آرايه اي
نگهداري كنيم : ولي با اطلاعاتي كه تاكنون از رشته ها داريم شايد نتوانيم چنين
كاري را انجام دهيم . براي اين كار بايد آرايه اي از رشته ها داشته باشيم . چون
رشته ها خود ازنوع آرايه هستند بايد آرايه اي ازآرايه ها را تعريف كنيم ( آرايه اي
از آرايه ها همان آرايه دوبعدي است ). براي توضيح بيشتر به مثال 1 توجه نماييد.
مثال : برنامه اي كه با تعريف آرايه اي از رشته ها ، 5 نام را در آن قرار
مي دهد و سپس با خواندن نامي از ورودي آنرا در آرايه جستجو مي كند . main)(
{
int dex/exist ;
int k ;
char name[21] ;
static char list [5][21]=
{ "ali" /
"ahmad" /
"alireza" /
"jalal" /
"mohammad"
} ;
printf("\nenter one name for");
printf(" search:");
gets(name );
for(dex=0 ; dex<5;dex++)
if(strcmp(list[dex]/name)==0)
{
exist=1 ;
break ;
}
if( exist==1)
{
printf("\nname ");
printf("<%s> exist in table."/name);
}
else
{
printf("\nname ");
printf("<%s> not exist. "/name);
}
}
دو نمونه از خروجي برنامه مثال بالا :
( الف ) enter one name for search:reza
name not exist.
( ب ) enter one name for search:ali
name exist in table.
ال بالا از تابع ()strcmp استفاده شده كه كارش مقايسه دو رشته مي باشد.
-
بعضي از توابع رشته اي
بعضي از توابع بر روي رشته ها عمل كرده و دستكاري رشته ها را آسان مي كنند .
كه مي توان از مقايسه رشته ها ، تعيين طول رشته ها، الحاق كردن رشته ها به يكديگر
و ... نام برد .
تابع ()strcpy
تابع ()strcpy براي قرار دادن رشته اي در رشته ديگر مورد استفاده قرار گرفته
و بصورت زير استفاده مي شود : ;
("رشته " و متغير رشته اي )strcpy
اهميت اين تابع وقتي مشخص مي شود كه بدانيم ، مقدار دادن به متغير رشته اي
بطور مستقيم امكان پذير نيست بلكه فقط از طريق اين تابع صورت پذيرد . مثلا" اگر
داشته باشيم : char name[11];
دستور انتساب زير غلط خواهد بود : name="ALI";
با استفاده از تابع ()strcpy عمل فوق را مي توان بصورت زير انجام داد : strcpy(name/"ALI");
اين مساله بدين علت است : " همانطور كه در C نمي توان دو آرايه را با حكم
انتساب (=) به يكديگر نسبت داد ، دو رشته نيز نمي توانند با حكم انتساب ، به
يكديگر نسبت داده شوند .
مثال 1: برنامه اي كه يك رشته و يك عدد( كه بيانگر موقعيتي ازاين رشته است )
را از ورودي خوانده و موجب حذف كاراكتر موجود در آن محل مي شود . main)(
{
char string[81] ;
int position ;
printf("\n type a string: " );
gets(string );
printf("\n enter position for " );
printf("delete character: " );
scanf("%d"/&position );
strcpy(&string[position]/
&string[position+1] );
puts(" the result string is :" );
puts(string );
}
نمونه اي از خروجي برنامه مثال 1: type a string: in thee name of allah.
enter position for delete character:5
the result string is:
in the name of allah.
در مثال 1 متغير position به موقعيتي از رشته اشاره ميكند كه كاراكتر موجود
در آن بايد حذف شود . با استفاده از تابع ()strcpy قسمتي از رشته string را با
شروع از position + 1 ، در همين رشته با شروع از موقعيت position كپي كرده ايم .
اين عمل موجب حذف كاراكتري كه در موقعيت position قرار داشته است مي گردد . با
فرض اين كه رشته ورودي برابر با "cart" و موقعيت كاراكتري كه بايد حذف شود 2
فرض گردد خروجي حاصل از اجراي برنامه مثال 1 بصورت زير خواهد بود : type a string: cart.
enter position for delete character:2
the result string is:cat
تابع ()strcat
اين تابع براي الحاق كردن ( به دنبال هم قرار دادن ) دو رشته استفاده ميشود
و بصورت زير به كار مي رود : strcat(s1/s2)
s1
و s2و دو رشته اي هستند كه بايد با هم الحاق شوند . s2 در انتهاي رشته s1
قرار خواهد گرفت .
مثال 2: main)(
{
char s1[21] / s2[21] ;
puts("enter string : " );
gets(s1 );
puts("enter string : " );
gets(s2 );
strcat(s1/s2 );
puts("result string is: " );
puts(s1 );
}
درپاسخ به درخواست برنامه ، اگر بجاي s1 عبارت good وبجاي s2 عبارت moorning
را وارد كنيم ، خروجي بدين صورت است : enter string :
good
enter string :
moorning.
result string is:
goodmoorning.
براي تمرين ميتوانيد برنامه را طوري تغيير دهيد كه بين دو عبارت ، يك فاصله
(blank) باشد .
تابع ()strlen
تابع ()strlen براي تعيين طول يك رشته مورد استفاده قرار گرفته و بصورت زير
به كار مي رود : strlen(s)
s
رشته اي است كه طول آن بايد تعيين شود .
مثال 3: main)(
{
char name[31] ;
puts(" enter a string: " );
gets(name );
printf("\n string length is:");
printf("%d"/strlen(name ));
}
نمونه اي از خروجي برنامه مثال 3 : enter a string:
the c language is very quick.
string length is:29
روش ديگر براي پيدا كردن طول يك رشته ، استفاده از تابع ()scanf با پارامتر
كنترلي %n است . با استفاده از تابع ()scanf و پارامتر %n ، مثال 3 را مي توان
بصورت زير نوشت : main)(
{
char name[31] ;
int count ;
scanf("%s%n"/name/&count);
printf("\n string length is:");
printf("%d"/count );
}
تابع ()strcmp
تابع ()strcmp براي مقايسه كاراكتري دو رشته مورد استفاده قرار ميگيرد و به
اين صورت بكار مي رود : strcmp(s1/s2)
s2
و s1و دو رشته اي هستند كه بايد با يكديگر مقايسه شوند . اين تابع نتيجه
مقايسه دو رشته را بصورت صفر ، منفي و يا مثبت مشخص مي كند :
نتيجه |(s1/s2()strcmp
ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ ؤؤؤ s1=s2 | 0
منفي | s2 <َs1
مثبت | s2 >َs1
تابع ()strchr
تابع ()strchr براي جستجوي يك كاراكتر در يك رشته بكار مي رود و محل وجود
اولين وقوع آن را مشخص مي كند. اگر كاراكتر مورد نظر در رشته وجود نداشته باشد
مقداري كه توسط اين تابع برگردانده مي شود برابر با صفر است . اين تابع بصورت
زير استفاده مي شود : strchr(s/ ch)
ch
كاراكتري است كه بايد در رشته s جستجو شود. بعنوان مثال ، بااجراي دستور: if( strchr( "hello"/'e'))printf( "e is in hello");
چون حرف e در عبارت hello وجود دارد پيام مناسبي چاپ مي شود .
تابع ()strstr
تابع ()strstr براي جستجو زير رشته اي در يك رشته مورد استفاده قرار گرفته و
بصورت زير بكار مي رود : strstr(s1/s2)
s2
رشته اي است كه بايد در رشته s1 جستجو شود . اگر s2در s1ر پيدا شود محل
اولين وقوع آن توسط تابع برگردانده مي شود ولي اگر s2در s1ر وجود نداشته باشد
مقدار صفر برگردانده خواهد شد . بعنوان مثال ، با اجراي دستور : if( strstr( "this is"/"hi"))printf( "hi found");
بعلت وجود رشته hi در رشته this is ، پيام مناسبي صادر مي شود .
مثال 4: main)(
{
char s1[80] / s2[80] ;
char ch ;
puts(" enter string : " );
gets(s1 );
puts(" enter string : " );
gets(s2 );
puts("enter character for search");
printf(" in s1: " );
ch=getche )(;
printf("\n length of s1 is:");
printf("%d"/strlen(s1 ));
printf("\n length of s2 is:");
printf("%d" /strlen(s2 ));
if(!strcmp(s1/s2))
printf("\n string are equal. ");
if(strstr(s1/s2))
printf("\n is in . " );
else
printf("\n is not in .");
if(strstr(s1/ch))
printf("\ncharacter<%c>is in.");
else
{
printf("\ncharacter<%c>is");
printf(" not in .");
}
}
نمونه اي از خروجي برنامه مثال 4 : enter string :
this is a sample statement.
enter string :
sample
enter character for search in : m
length of is:28
length of is:6
is in .
character is
-
اشاره گرها
درك صحيح مفهوم اشاره گرها در زبان C بزرگترين موفقيت يك برنامه نويس است .
زيرا استفاده از اشاره گرها ويژگيهاي زير را دارد : 1
عمل تخصيص حافظه پويا امكان پذير است . 2
موجب بهبود كارآيي بسياري از توابع مي شود . 3
كار با رشته ها و آرايه ها را آسانتر مي كند . 4
فراخواني با ارجاع در توابع ، از طريق اشاره گرها امكان پذير است .
كليه متغيرهايي كه در برنامه ها مورداستفاده قرار ميگيرند در حافظه كامپيوتر
ذخيره مي شوند ( محل هايي از حافظه هستند ) . بنابراين هر متغير داراي يك آدرس
منحصر بفردي است كه توسط آن مي توان به متغير دسترسي پيدا كرد. اشاره گرها حاوي
آدرس متغيرهاي حافظه هستند. بعبارت ديگر اگر متغيري آدرس متغير ديگر را در خود
نگهداري كند به متغير اول يك اشاره گر گفته مي شود . بعنوان مثال ، اگر محتويات
متغيري كه در محل 1000 حافظه قرار دارد برابر با 1004 باشد ، اين متغير به محل 1004
حافظه اشاره خواهد كرد ( شكل 1 ) .
ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ |
محتويات حافظه | آدرس حافظه
ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ
ؤؤؤؤؤؤ 1004 | 1000 |
ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ 1001 | | |
|
ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ 1002 | | |
|
ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ 1003 | | |
|
ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ
<ؤؤؤؤ| | 1004
ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ 1005 | |
ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ
شكل (1) . مفهوم اشاره گر
براي تعريف متغيرهاي اشاره گر از روش كلي زير استفاده مي شود :
نام متغير اشاره گر * نوع
نوع ، يكي از انواع معتبر در زبان C است . نوع اشاره گر مشخص مي كند كه اين
اشاره گر بايد به چه نوع داده اي اشاره كند ( سر و كارش با چه نوع داده اي است ).
در زبان C برخلاف زبان هايي مثل PL/I اشاره گرها داراي نوع هستند. لذا دراستفاده
از اشاره گرها بايد دقت كافي بخرج داد تا نتيجه نادرستي از برنامه حاصل نگردد .
بعنوان مثال ، دستور int *p; متغير p را از نوع اشاره گر تعريف مي كند كه فقط
بايد به متغيرهاي از نوع "صحيح " اشاره نمايد. البته اگر اشاره گرp به متغيرهايي
از انواع ديگر اشاره نمايد ، كامپايلر زبان C خطايي را به برنامه نويس اعلام
نمي كند ولي برنامه نويس بايد بداند كه اين امر يقينا" در نتيجه اجراي برنامه
اثر گذاشته و موجب عدم صحت اجراي برنامه گشته و به نتايج حاصل از برنامه
اطميناني نيست . بعنوان مثال در حين اجراي برنامه زير از طرف كامپايلر خطايي
گزارش نخواهد شد ولي مي دانيم كه اين برنامه نتيجه مطلوبي نخواهد داشت . main)(
{
float x/y ;
int *p ;
p=&x ;
y=*p ;
}
در برنامه فوق ، چون p به متغير x اشاره ميكند و p از نوع " صحيح " است ، x
را بصورت عدد " صحيح " در نظر ميگيرد و در دستور بعدي كه محتويات محلي كه p به را به y منتقل مي كند، عمل انتقال به درستي انجام نميشود.
-
عملگرهاي اشاره گر
دو عملگر در مورد اشاره گرها مورد استفاده قرار مي گيرند كه عبارتند از : *
و & . عملگر & يك عملگر يكاني است كه آدرس عملوند خود را مشخص مي كند . بعنوان
مثال دستور m = &name موجب مي شود تا آدرس متغير name در متغير m قرار گيرد .
عملگر * همانند عملگر & يك عملگر يكاني است ، محتويات يك آدرس حافظه را مشخص
مي كند . بعنوان مثال دستور p = m; موجب مي شود تا محتويات محلي كه آدرس آن در m
است به p منتقل گردد . بنابراين مجموعه دستورات (1) و (2) كه در ذيل آمده اند
معادل يكديگرند .
ؤ m= &name;
(َ1) ؤ
ؤ p= *m;
p= nam;( 2)
-
اعمال روي اشاره گرها
اعمالي كه بر روي اشاره گرها فايل انجام است به وسعت اعمالي كه بر روي ساير
متغيرهاي حافظه انجام پذير است ، نيست . اعمالي كه بر روي اشاره گرها انجام
پذيرند عبارتند از : 1
عمل انتساب : همچون ساير انواع متغيرها، ميتوان مقداري را به يك اشاره گر
نسبت داد ( مثال 1 ) . 2
اعمال محاسباتي : دو نوع اعمال محاسباتي مي توان بر روي اشاره گرها انجام
داد كه عبارتند از :
الف ) عمل جمع .
ب ) عمل تفريق .
مثال 1: main)(
{
int x ;
int *p1 / *p2 ;
p1=&x ;
p2=p1 ;
printf("\n the address of x is: ");
printf("%p"/p2 );
}
نمونه اي از خروجي برنامه مثال 1 : the address of x is:692B:0fDC
براي پي بردن به چگونگي عمل جمع و تفريق روي اشاره گرها فرض كنيد كه p
اشاره گري از نوع " صحيح " است و به ملح 2000 حافظه اشاره مي كند . اكنون دستور p + +;
را اجرا كنيم محتويات جديد اشاره گر p ، برابر با 2002 خواهد بود . زيرا
طول نوع " صحيح " برابر با 2 بايت است و با افزايش يك واحد به اشاره گر ، به
اندازه طول نوع اشاره گر به آن افزوده خواهد شد و نه به اندازه يك واحد . اگر
دستور ; - p- را صادر كنيم ، اشاره گر P مجددا" به محل 2000 حافظه اشاره خواهد
كرد . اگر باز هم دستور ; - p- را صادر كنيم اين بار به محل 1988 اشاره خواهد
كرد ( شكل 1 ) . char *ch= 2000;
int *i=2000;
ؤؤؤؤؤؤؤؤؤؤؤؤؤؤ ch | 2000 | i
ؤؤؤؤؤؤؤؤؤؤؤؤؤؤ ch+1 | 2001 |
ؤؤؤؤؤؤؤؤؤؤؤؤؤؤ ch+2 | 2002 | i+1
ؤؤؤؤؤؤؤؤؤؤؤؤؤؤ ch+3 | 2003 |
ؤؤؤؤؤؤؤؤؤؤؤؤؤؤ ch+4 | 2004 | i+2
ؤؤؤؤؤؤؤؤؤؤؤؤؤؤ ch+5 | 2005 |
ؤؤؤؤؤؤؤؤؤؤؤؤؤؤ
حافظه
شكل (1) . انجام اعمال محاسباتي روي اشاره گر
3
مقايسه اشاره گرها : بااستفاده از عملگرهاي رابطه اي مي توان اشاره گرها را
با يكديگر مقايسه نمود. بعنوان مثال ، اگر pو qو از نوع اشاره گر باشند ، دستور
زير معتبر است : if(p < q )print f("p points to lower memory than q");
مقايسه اشاره گرها معمولا" در مواردي استفاده مي شود كه دو يا چند اشاره گر به اشاره مي كنند .
-
اشاره گر و آرايه
در زبان C بين آرايه ها و اشاره گرها ارتباط نزديكي وجود دارد ( اشاره گرها
حاوي يك آدرس و اسم آرايه نيز يك آدرس است ). اسم آرايه آدرس اوليه عنصر آرايه
را مشخص مي كند . بعبارت ديگر اسم آرايه آدرس اولين محلي را كه عناصر آرايه از
آنجا به بعد در حافظه قرار مي گيرند در خود نگهداري مي كند . بعنوان مثال اگر
آرايه اي بصورت table[8] تعريف كرده باشيم و اولين عنصر آرايه در محل 400 حافظه
قرار داشته باشد و اشاره گري بنام ptr بصورت زير تعريف كرده باشيم ، int * ptr;
دستور ptr = & table[0] آدرس شروع آرايه يعني 400 را در اشاره گر ptr قرار
مي دهد ( اين دستور معادل دستور ptr = table; است ) و دستور t = * ptr محتويات
اولين محل آرايه ( اولين عنصر آرايه ) يعني (table[0]) را در متغيرt قرار داده
دستور * ptr = 0 محتويات اولين محل آرايه table را برابر با صفر قرار مي دهد .
با مطالبي كه تاكنون گفته شد براي دسترسي به عناصر آرايه علاوه بر انديس ، از
اشاره گرها نيز مي توان استفاده كرد :
آدرس آرايه را در اشاره گر ptr قرار مي دهد ptr= table;
به دومين عنصر آرايه اشاره مي كند (table[1]);(َptr+ 1) *
به i+1 امين عنصر آرايه اشاره مي كند ;(ptr+i) *
مثال : برنامه اي كه 5 مقدار را از ورودي خوانده و در آرايه اي قرار مي دهد .
سپس آنها را از آخرين مقدار به اولين مقدار به خروجي منتقل مي كند . main)(
{
int arr[5] /i ;
printf("\n enter five value: " );
for(i=0 ; i<5 ; i++)
scanf("%d"/&arr[i] );
printf("\n the reverse output is: ");
for(i=4 ; i>=0 ; i) --
printf("%4d"/*(arr+i ));
}
نمونه اي از خروجي برنامه مثال بالا : enter five value: 10 20 30 40 50
the reverse output is:50 40 30 20
-
مرسي كارلوس
هنوز نخوندم . اما مطمنم همين چند روزه بكارم مياد
بازم تشكر
-
سلام
دوسته عزيز من هميشه يه آموزش که ميزرم يه چيزه کامل و به درد بخور ميزرم آخه بعضی از دوستان آموزش ميزارن آدم بدتر اسبنی ميشه که چيزی نفهميد ولی بر عکس بعضی ها هم مثل خودم آموزش ميزارن اين خيلی به درد بخور و کامل هست من ديگه والّا پی دی اف نميکنم آخه قبلاً اين کار را ميکردم هی ميگفتند که ماله ما دانلود نشد يا سايت ----- ميشد يا مشگل داشت ديگه من تصميم گرفتم که همينجا بگزرم که هر کی که خواست خودش پی دی اف کنه
-
سلام
کسانی که به دنبال ياد گرفتن آموزش اين برنامه بودند چرا نميگن آيا اين به دردشن کرد يا نه؟ اصلاً خوبه يا نه