ParsX.com
پذیرش پروژه از دانشجویی ... تا سازمانی 09376225339
 
   ProfileProfile   Log in to check your private messagesLog in to check your private messages  |  FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups Log inLog in   RegisterRegister 

رشته ها در C

 
Post new topic   Reply to topic    ParsX.com Forum Index -> C/C++ Programming
View previous topic :: View next topic  
Author Message
arash
مدير بخش سي
مدير بخش سي


Joined: 27 Nov 2004
Posts: 1232
Location: www.parsx.com

PostPosted: Fri Nov 04, 2005 5:34 pm    Post subject: رشته ها در C Reply with quote

رشته ها:
در زبان C رشته آرایه ای از کارکترهاست و نوع جدیدی به نام string وجود ندارد .
در هر دو زبان C وپاسکال مکانیزمی جهت نگهداری طول واقعی رشته ارائه شده است بدین ترتیب که در زبان پاسکال در خانه صفرم طول رشته لحاظ می شود ولی در زبان C رشته ها به صورت Null terminated ( یا مختوم به صفر ) تعریف میشوند .

char s2[10];
char s3[10]="COMPUTER"

C   O   M   P   U   T   E   R   \0  ?
0   1   2    3    4    5   6   7   8   9


در خانه شماره 8 متغییر s3 مقدار \0 یا همان کاراکتر پایان رشته با کد اسکی 0 قرار گرفته و در خانه 9 این آرایه یک مقدار نامشخص قرار می گیرد و ما به جای آن علامت سوال (؟) گزاشتیم .


char s3[]="Digital"

با این دستور کامپایر به تعداد حروف دیجیتال ( یعنی 8 ) آرایه از نوع کاراکتر در نظر گرفته و آخرین
کارکتر را با مقدار(Null (\0 مقدار دهی می کند .
char s4[] = { 'A','L','I', '\0'};
char s5[] = {49,50,48,0};

با این دستور کامپایر به 3 حرف A و L و I را به ترتیب در آرایه صفر تا سه قرار می دهد واما خودما آخرین خانه را با مقدار Null مقدار دهی می کنیم . می توان بجای گزاشتن مستقیم کاراکترها از کد ASCII آن استفاده کرد .

توابع ورودی و خروجی رشته ها :
دو تابع که مختص رشته ها می باشند یکی ( رشته )puts و دیگری ( متغییر رشته ای )gets است .
تابع puts کراکتر یک رشته ای را که به یک کاراکتر Null نرسیده است چاپ می کند . تابع gets نیز تابعی است که تا وقتی کلید Enter را فشار ندهیم یک رشته را از ورودی دریافت می کند و انتهای رشته را نیز مشخص می نماید .
نکتهExclamation :
برای گرفتن رشته از ورودی می توان از توابع scanf و printf نیز به شکل زیر استفاده کرد .
printf("%s",متغییر رشته ای );
  یا printf( رشته );
scanf("%s", متغییر رشته ای  );

سایر توابع رشته ای که در فایل سرآیند(یا string.h> ( header>تعریف شده اند از این قرارند :
strlen( رشته );

مثال :
 char s1[]="ALI";

int n;
n = strlen(s1);

در مثال فوق مقدار رشته s1 یعنی 3 در متغییری به نام n قرار می گیرد .
در صورتی که بخواهیم یک رشته را به رشته ای دیگر انتساب دهیم (یعنی مقدار یک رشته را در دیگری قرار دهیم ) از تابع )رشته اول , رشته دوم strcpy(با این دستور مقدار رشته اول را در رشته دوم قرار می دهیم . تعداد آرایه های رشته دوم باید بزکتر یا مساوی رشته اول باشد در غیر اینصورت عمل انتساب بطور ناقص انجام می شود .
در صورتی که بخواهیم یک رشته را با رشته ای دیگر جمع کنیم ( یعنی مقدار یک رشته را به آخر رشته دیگر اضافه کنیم ) از تابع )رشته اول , رشته دوم strcat(با این دستور مقدار رشته اول را به مقدار رشته دوم می چسبانیم . تعداد آرایه های رشته دوم باید بزکتر یا مساوی مجموع رشته ها باشد در غیر اینصورت عمل جمع بطور ناقص انجام شده و با عث می شود تا مقداری از اطلاعات از بین رفته یا دستیابی به آن مشکل شود .
مثال :
 char s1[10];
strcpy(s1,"ALI");
strcat(s1,"Reza");

که در نهایت در داخل s1 مقدار ALIReza ذخیره می شود .
و در نهایت برای مقایسه دو رشته از تابع( strcmp( s1 , s2 استفاده می کنیم . و در استفاده از این تابع یکی از حالتهای زیر رخ می دهد .
 
   یک عدد منفی , s1<s2
   عدد صفر       , s1=s2
یک عدد مثبت    , s1>s2

مقدار( strcmp( s1 , s2 باید در یک متغییر ریخته شده و مقایسه بروی آن متغییر انجام گیرد .


Last edited by arash on Fri Jan 20, 2006 6:43 pm; edited 2 times in total
Back to top
arash
مدير بخش سي
مدير بخش سي


Joined: 27 Nov 2004
Posts: 1232
Location: www.parsx.com

PostPosted: Tue Nov 08, 2005 10:42 pm    Post subject: Reply with quote

تابع strchr :
تابعی است که به دنبال یک کاراکتر در یک رشته میگردد و آدرس اولین وقوع کاراکتر را در رشته اگر پیدا کند بر می گرداند وگرنه Null بر می گرداند .
تابع strrchr :
تابعی است که به دنبال یک کاراکتر در یک رشته میگردد و آدرس آخرین وقوع کاراکتر را در رشته اگر پیدا کند بر می گرداند وگرنه Null بر می گرداند .
تابع strstr :
این تابع که به شکل strstr(str1,str2) می باشد به دنبال str2 در str1 می گردد در صورت وجود آدرس ابتدای اولین وقوع آنرا بر می گرداند .
Char s1[]="This is my book";
Char s2[]="is";
Char ch='i';
N=strchr(s1,ch)-s1;

مقدار N برابر با اندیس آرایه ای است که در آن s1 به وقوع پیوسته .
چون تابع strchar(s1,ch) آدرس باز می گرداند نه اندیس ارایه را پس مجبور خواهیم بود آدرس ارایه را از مقدار آدرس متغییر s1 کم کنیم تا اندیس i ام از این تابع را پیدا کنیم .
مثلا اگر آدرس s1 برابر با 1000 باشد پس تابع strchar(s1,ch) مقدار 1003 رل بر می گرداند پس برای اینکه n برابر با مقدار 3 بشود باید آن را از s1 که 1000 است کم کرد تا اندیس مورد نیاز پدید آید.

اشاره گرها و تخصیص حافظه پویا :
Int n;
Int list[10];
Char str[100];

در مثال بالا تعداد 10 خانه به طور ثابت برای متغییر List در نظر گرفته می شود و در طی اجرای برنامه دیگر مقدار این حافظه تخصیص یافته قابل تغییر نمی باشد .
برای رفع این مشکل باید از حافظه پویا بهره برد . حافظه پویا در واقعه حافظه ای است که در زمان اجرا توسط کاربر ایجاد یا اخذ شده و پس از پایان کار اجرا دوباره به سیستم باز گردانده می شود . و مضیت آن نسبت به حافظه ثابت اینست که به میزان لازم حافظه اخذ شده و محدودیتی نیز برای آن وجود ندارد .
برای اخذ حافظه از توابع ()malloc و برای آزاد سازی حافظه از تابع ()free استفاده می شود .
شکل دستوری این دو تابع به ترتیب عبارتند از :
اشاره گر = (نوع) malloc(size);
free(اشاره کر);

مثال: تکه برنامه ای بنویسید که یک آرایه به طول متغییر n که یک عدد صحیح است تعریف نموده ( n را از ورودی دریافت می کند ) سپس کلیه این اعداد صحیح را از ورودی خوانده و ماکزیمم مقدار فوق را در خروجی چاپ کند ؟
int *ptri;
char *ptrc;
float *ptrf;
ptri=(int *)malloc(10*sizeof(int));
ptrc=(char  *)malloc(5*sizeof(char));
ptrf=(float *)malloc(sizeof(float));

اشاره گرها و رشته ها :
برای پیدا رشته از یک حلقه while استفاده می شود .
While(*ptr)
{
ptr++
}

تمرین Arrow : توابع strlen , strchr , strrchr , strcat , را مجددا خودتان باز سازی کنید ؟

مثال : تابعی بنویسید که یک رشته و یک کاراکتر را گرفته تعداد حضور کاراکتر در رشته را باز گرداند ؟
int strchrcount(char *str,char ch)
{
  int count=0;
  while(*str)
  {
    if(*str==ch)count++;
    str++;
  }
 return (count);
}

یادآوری Idea :
کلاس مجموعه ای از خصوصیات و رفتارهایی که تحت قالب یک مفهوم کنار هم آمده باشند .

ساختار یا ساختمان :
در زبان C به record وازه struct ( که مخفف stretcher می باشد ) می گویند و مجموعه ای است از مشخصه های مختلف که تحت یک غالب مشترک و هم نام در آمده باشند. هر یک از این مشخصه ها می تواند دارای نوع متفاوتی باشد .
طرز دسترسی به یک فیلد از یک رکورد :
کافیست به شکل زیر خاصیت مورد نظر را فراخوانی کرد نام فیلد . نام رکور
stu.name , stu.tel , stu.bornyear , …

طرز تعریف ساختار یا رکورد :
برای تعریف یک ساختار از اولگوی زیر استفاده می شود
struct{
             نوع فیلد 1    نام فیلد 1 ;
             نوع فیلد 2    نام فیلد 2 ;
             .
             .
             .
          } متغییر 1 , متغییر2 , نام آرایه و اشاره گر* [100] ;

مثال : متغییر s1 و s2 و آرایه 100 تایی List را از نوع ساختار دانشجویی با مشخصات ذکر شده تعریف کنید ؟
struc{
           char number[12];
           char tel[20];
           float average;
           int bornyear;
         } stu1,stu2,list[100];

مثال : تکه برنامهای بنویسید که به فرض اینکه list یک سری مشخصات دانشجویان را داراست تعداد دانشجویانی که نامشان علی است را محاسبه و در خروجی چاپ کند ؟
for(i=0;i<100;i++)
if (!strcmp(list[i].name,"Ali")
           count++;
printf("\n\n\n student whit name of Ali "%d",count);

تمرین Arrow : برنامه ای بنویسید و در آن یک لیست 50 تایی از دانشجویان با مشخصات فوق تعریف کرده و
الف ) تابعی بنویسید که تعداد و اطلاعات دا نشجویان را از ورودی بخواند ؟
ب ) تابعی بنویسید که یک عدد صحیح از بگیرد ( به عنوان پارامتر ) دانشجویانی که اندیس آن i است در خروجی بنویسد
ج ) تابعی بنویسید که یک رشته از ورودی گرفته و معدلهای دانشجویان که نامشان برابر این رشته معین است برگرداند
د ) تابعی بنویسید که یک رشته از ورودی بگیرد تعداد دانشجویانی که پیش شماره تلفن آنها برابر رشته مزبور است برگرداند .
Back to top
arash
مدير بخش سي
مدير بخش سي


Joined: 27 Nov 2004
Posts: 1232
Location: www.parsx.com

PostPosted: Tue Nov 08, 2005 10:44 pm    Post subject: Reply with quote

vahid wrote:
سورس كد تابع رشته اي strstr كه چگونه ساخته شده است را ميتوانيد در ادرس زير پيدا كنيد :
http://computer.parsx.com/viewtopic.php?p=765#765
Back to top
Display posts from previous:   
Post new topic   Reply to topic    ParsX.com Forum Index -> C/C++ Programming All times are GMT + 3.5 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum