آموزش رشته ها در زبان C
در این آموزش با رشته ها آشنا می شوید و در خواهید یافت که رشته ها در زبان C، هم نوعی آرایه می باشند ولی فقط آرایه ای از کاراکترها. در ادامه مباحث، آرایه ای از رشته ها بحث شده و در پایان توابع پر کاربرد get و cin در خواندن رشته ها با تشریح کامل و به همراه مثال، آورده شده است. یکی از کاربرد های گسترده آرایه به صورت آرایه کاراکتری است. یک آرایه کاراکتری را به عنوان رشته ای از کاراکترها می توان در نظر گرفت. رشته (string) به مجموعه ای از کاراکترها گفته می شود که برای ذخیره متن استفاده می شود. که در این مبحث به صورت کامل به آموزش رشته ها در زبان C ، می پردازیم.
۱– رشته ها
در زبانهای برنامه سازی مختلف رشته ها به عنوان نوع داده می باشند که برای نگهداری اسامی و متن ها بکار می روند. در زبان C رشته ها نوع داده نیستند بلکه آرایه ای از کاراکترها می باشند که به NULL که دارای ارزش عددی صفر است ختم می شود. برای نمایش NULL از کاراکتر ۰\ استفاده می شود.
char name[١٠];
در مثال فوق متغیر name بعنوان یک آرایه ۱۰عضوی از کارکترها تعریف شده است، بنابراین می تواند یک رشته با حداکثر ۱۰ کاراکتر را در خود نگاه دارد. اما فرض کنید قصد داریم رشته ای مانند Ali را در این متغیر ذخیره نماییم که کمتر از ۱۰کارکتر دارد. دراینصورت زبان C چگونه دریابد که در هنگام انجام عملیات مختلف برروی این رشته، مثلا در هنگام چاپ آن، فقط باید ۳ حرف اول رشته را چاپ نماید؟ برای حل این مشکل، طراحان زبان C از یک کارکتر خاص بنام null استفاده کردند. کلیه رشته ها در زبان C باید به کاراکتر null ختم گردند. در حقیقت در زبان C یک رشته هنگامی که به null برسد، خاتمه می یابد و نه زمانیکه به انتهای آرایه برسد.
در زبان C باید طول رشته یک واحد بیشتر از طول واقعی آن باشد تا بتوانیم کاراکتر null را در آخر آن قرار دهیم.
به مثال زیر دقت کنید:
char s [10] = {'A', 'l', 'i', '\0' };
در مثال فوق، متغیر s بصورت آرایه ای ۱۰عضوی ازکاراکتر تعریف شده و مقدار اولیه ali به آن نسبت داده شده است. دقت کنید
که در حقیقت ۴ عضو از آرایه پر شده است و عضو آخر به null تخصص داده شده است. مقادیر عناصر بعدی آرایه مهم نیست، چرا که در هنگام انجام عملیات برروی رشته s از آنها صرفنظر می گردد. بنابراین دقت کنید که در هنگام تعریف یک رشته، یکعنصر اضافه برای کاراکتر null در نظر بگیرید.
نکته: یک “لیترال” رشته ای از حروف، ارقام یا علایم چاپی است که میان دو علامت نقل قول ” ” محصور شده باشد. یک کاراکتر یک حرف، رقم یا علامت قابل چاپ است که میان دونشانۀ ‘ ‘ محصور شده باشد.
۲– مقداردهی اولیه به رشته ها
هنگام تعریف رشته ها می توان به آنها مقدار اولیه داد. هنگام مقدار اولیه دادن می توان طول رشته را مشخص نکرد. در اینصورت، اندازه رشته یک واحد بیش از تعداد کاراکترهایی است که به آن نسبت داده می شود. دو روش برای مقدار اولیه دادن به رشته ها وجود دارد:
- رشته در داخل کوتیشن قرار گرفته و به متغیر رشته ای نسبت داده شود. در این روش کاراکتر ’۰\ ‘ به طور خودکار در انتهای رشته قرار می گیرد.
char Str1[]=”kiyanmajd” char Str2[15]=”kiyanmajd” Str1
مقادیر موجود در ۵ عضو آخر str1 هر مقداری می تواند باشد و از نظر برنامه نویس مهم نیستند، چرا که توابع رشته ای آنها را پردازش نمی کنند.
- هر یک از کاراکترهای رشته ای به عنوان یک عنصر رشته به ارایه نسبت داده شوند. در این روش کاراکتر بر خلاف روش اول، ’ ۰\‘ باید توسط برنامه نویس در انتهای رشته قرار داده شود.
char Str3[]={‘k’,’I’,’y’,’a’,’n’,’m’,’a’,’j’,’d’,’\۰’} char Str4[15]= {‘k’,’I’,’y’,’a’,’n’,’m’,’a’,’j’,’d’,’\۰’}
نکته آخر اینکه به جز در هنگام مقداردهی اولیه، نمی توانید در برنامه از عملگر = برای مقداردهی به یک رشته استفاده نمایید. به عنوان مثال دستور زیر خطای نحوی محسوب می گردد.
char str[10];
str = "Ali" ;
نکته: رشته ها در حقیقت یک آرایه هستند و نمی توان کل یک آرایه را با یک دستور مقداردهی کرد. برای مقداردهی به یک رشته، باید به تک تک عناصر آن را جداگانه مقدار داد و یا از توابع کتابخانه ای C استفاده کرد.
۳– آرایه ای از رشته ها
اگر بخواهیم متغیری را تعریف کنیم که چندین رشته را در خود نگه دارد باید آرایه ای از رشته ها تعریف کنیم. برای تعریف آرایه ای از رشته ها به صورت زیر عمل می کنیم:
برای بازیابی هر یک از رشته ها باید از یک اندیس استفاده کنیم.
char names[7][6] = { "Ryan", "Tom", "Chad",
"Jacki", "Tara", "Lori",
"Kelly" };
اگر حداکثر طول رشته ها نوشته نشود کامپایلر با شمارش طول مقادیر اولیه آنرا محاسبه خواهد کرد.
char names[7][] = { "Ryan", "Tom", "Chad",
"Jacki", "Tara", "Lori",
"Kelly" }
برای استفاده از یک رشته نام آرایه دوبعدی به همراه یک اندیس بکار میرود.
char names[7][] = { "Ryan", "Tom", "Chad",
"Jacki", "Tara", "Lori",
"Kelly" }
*مثال: برنامه ای که اسامی ۵دانشجو را خوانده و بصورت صعودی مرتب نماید.
main(){ int i,j; char name[5][40],temp[40]; for(i=0;i<5;i++) gets(name[0]); for(j=0;j<5;j++) for(i=0;i<5-j;i++) if(strcmp(name[i],name[i+1])>0){ strcpy(temp,name[i]); strcpy(name[i],name[i+1]); strcpy(name[i+1],temp);} for(i=0;i<5;i++) puts(name[0]);}
۴– ورودی-خروجی رشته ها
از دستورات cin و cout می توان برای ورودی-خروجی رشته ها استفاده کرد. در دستورات زیر، cin رشته first را می خواند و cout آنرا در صفحه نمایش چاپ می کند:
Char first[21]; Cin>>first; Cout<<”first is: ”<<first;
۵– خواندن رشته با تابع get
این تابع عضو شی cin است. از این تابع به صورت های زیر برای خواندن رشته ها استفاده می شود:
Cin.get(نام رشته, طول رشته) Cin.get(نام رشته, طول رشته , ‘جداکننده’)
در کاربرد اول، برای خواندن رشته، نام رشته و حداکثر تعداد کاراکترهایی که باید از ورودی خوانده شود مشخص می شود و ‘\n’ تعیین کننده انتهای رشته است. ولی در کاربرد دوم، می توانیم با ‘جداکننده’ کاراکتری را که پایان جمله را مشخص می کند، تعیین کنیم. به دستورات زیر توجه کنید:
Char s[5]; Cin.get(s,15); Cin.get(s,15,’.’);
دستور اول رشته s را به طول ۲۰ تعریف می کند، دستور دوم حداکثر ۱۵ کاراکتر را خوانده در s قرار می دهد و با رسیدن به کلید enter انتهای رشته مشخص می شود. دستور سوم حداکثر ۱۵ کاراکتر را از ورودی می خواند و یا پس از رسیدن به نقطه، خواندن رشته خاتمه می یابد. به عبارت دیگر نقطه پایان رشته را مشخص می کند.
۶– تفاوت get و cin در خواندن رشته ها
همانگونه که گفته شد انتهای ورودی دستور cin را یا Enter مشخص مـیکنـد یـا pace ولـی در cin میتوانیم فاصله و tab را نیز به رشته بدهیم. در تابع get فقط کلید Enter انتهای رشته را مشخص می کند، مگر اینکه برنامه نویس کاراکتر دیگری را برای این منظور مشخص کند. در این تابع، رشته می تواند حاوی فاصله و یا Tab باشد. در حالی که در دستور cin، فاصله و Tab نیز به عنوان جداکننده تلقی شده انتهای رشته را مشخص می کند. به عنوان مثال دستورات زیر را در نظر بگیرید:
Char s[15]; Cin.get(s,30); Cin>>s;
اگر در پاسخ به این دستورات، رشته “computer science” را وارد کنیم، تابع get() کل رشته را می خواند در حالی که cin فقط رشته “computer” را می پذیرد چرا که فضای خالی بعد از آن به عنوان انتهای رشته تلقی می شود.