مهندس موفق الکترونیک

رشته ها در زبان C

رشته ها در زبان C را بررسی میکنیم ولی قبل از آن باید بدانیم رشته چیست؟ رشته چیزی جز مجموعه ای از کارکترها در یک دنباله خطی نیست.زبان ’C’  با یک رشته همواره مانند یک داده منفرد رفتار می کند، حتی اگرآن رشته حاوی فضای خالی باشد. یک کارکتر تنها با استفاده از تک کوتیشن(‘ ‘) نمایش داده می شود. یک رشته با علامت دابل کوتیشن(“ ”) نمایش داده می شود.

Example, "Welcome to Melec.ir!"

زبان ‘C’ کتابخانه استاندارد <string.h> را که شامل توابع ساده برای انجام عملیات پیچیده روی رشته ها است مهیا ساخته است.

در این مبحث خواهیم آموخت:

  • رشته چیست؟
  • اعلان و مقداردهی یک رشته
  • رشته ورودی: خواندن یک رشته
  • رشته خروجی: چاپ/نمایش یک رشته
    • تابع fputs
    • تابع puts
  • کتابخانه string
  • تبدیل رشته به عدد

رشته ها در زبان C

اعلان و مقداردهی اولیه  یک رشته

یک رشته یک آرایه ساده با نوع داده char می باشد. زبان C از نوع داده رشته به صورت مستقیم پشتیبانی نمی کند. بنابراین، برای نمایش یک رشته در زبان C ، باید از آرایه کارکتری استفاده کنید.

ساختار عمومی برای اعلان یک متغیر رشته ای به صورت زیر است:

char string_variable_name [array_size];

اعلان رشته کلاسیک را می توان به صورت زیر هم انجام داد:

char string_name[string_length] = "string";

اندازه یک آرایه باید هنگام اعلان متغیر رشته ای مشخص شده باشد زیرا از آن برای محاسبه تعداد کارکترهایی که درون متغیر رشته ای ذخیره می شود استفاده می شود.چند مثال از اعلان صحیح رشته ها مانند زیر است:

char first_name[15];    //declaration of a string variable

char last_name[15];

مثال فوق متغیرهای رشته ای با اندازه آرایه 15 را نشان می دهد، یعنی اینکه آرایه کارکتری داده شده ظرفیت ذخیره حداکثر 15 کارکتر را دارد. شاخص گذاری(Indexing) آرایه از عدد 0 شروع می شود بنابراین کارکترها در مکان 0-14 ذخیره می شوند. کامپایلر C به صورت خودکار کارکتر NULL ‘\0’    را به انتهای آرایه ایجاد شده می افزاید.

اجازه دهید مقداردهی اولیه یک متغیر رشته ای را بررسی کنیم.مثال زیر نحوه مقداردهی اولیه یک متغیر رشته ای را نشان می دهد،

char first_name[15] = "Milad";

char first_name[15] = {'A','N','T','H','O','N','Y','
char first_name[15] = "Milad";
char first_name[15] = {'A','N','T','H','O','N','Y','\0'}; // NULL character '\0' is required at end in this declaration
char string1 [6] = "hello";/* string size = 'h'+'e'+'l'+'l'+'o'+"NULL" = 6 */
char string2 [ ] = "world";  /* string size = 'w'+'o'+'r'+'l'+'d'+"NULL" = 6 */
char string3[6] = {'h', 'e', 'l', 'l', 'o', '\0'} ; /*Declaration as set of characters ,Size 6*/
'}; // NULL character '
char first_name[15] = "Milad";
char first_name[15] = {'A','N','T','H','O','N','Y','\0'}; // NULL character '\0' is required at end in this declaration
char string1 [6] = "hello";/* string size = 'h'+'e'+'l'+'l'+'o'+"NULL" = 6 */
char string2 [ ] = "world";  /* string size = 'w'+'o'+'r'+'l'+'d'+"NULL" = 6 */
char string3[6] = {'h', 'e', 'l', 'l', 'o', '\0'} ; /*Declaration as set of characters ,Size 6*/
' is required at end in this declaration char string1 [6] = "hello";/* string size = 'h'+'e'+'l'+'l'+'o'+"NULL" = 6 */ char string2 [ ] = "world";  /* string size = 'w'+'o'+'r'+'l'+'d'+"NULL" = 6 */ char string3[6] = {'h', 'e', 'l', 'l', 'o', '
char first_name[15] = "Milad";
char first_name[15] = {'A','N','T','H','O','N','Y','\0'}; // NULL character '\0' is required at end in this declaration
char string1 [6] = "hello";/* string size = 'h'+'e'+'l'+'l'+'o'+"NULL" = 6 */
char string2 [ ] = "world";  /* string size = 'w'+'o'+'r'+'l'+'d'+"NULL" = 6 */
char string3[6] = {'h', 'e', 'l', 'l', 'o', '\0'} ; /*Declaration as set of characters ,Size 6*/
'} ; /*Declaration as set of characters ,Size 6*/

در string3 ، کارکتر NULL باید به صورت صریح اضافه شود و کارکترها درون علامت تک کوتیشن قرار می گیرند.

زبان ‘C’ همچنین این اجازه را فراهم می کند که یک متغیر رشته ای را بدون تعریف اندازه آرایه کارکتری مقداردهی اولیه کنیم. این کار را می توان به شکل زیر انجام داد:

char first_name[ ] = "NATHAN";

نام رشته به عنوان یک اشاره گر(pointer) عمل می کند زیرا اصولاً نوعی آرایه است.

مطلب پیشنهادی:  دستورات شرطی در زبان C

ورودی رشته: خواندن یک رشته

زبان C توابع ()scanf()، gets، و ()fgets را برای دریافت متن ورودی از طرف کاربر، هنگام نوشتن برنامه های محاوره ای(interactive) که از کاربر درخواست ورودی می کند گردآوری کرده است. هنگام استفاده از ()scanf برای خواندن ورودی، از فرمت دهنده “%s” بدون استفاده از “&”، برای دستیابی به آدرس متغیر استفاده می کنیم زیرا نام آرایه خود به عنوان یک اشاره گر عمل می کند.برای مثال:

#include <stdio.h>

int main() {

char name[10];

int age;

printf("Enter your first name and age: \n");

scanf("%s %d", name, &age);

printf("You entered: %s %d",name,&age);

خروجی:

Enter your first name and age:

John_Smith 48

مشکل استفاده از تابع scanf این است که هرگز یک رشته کامل را از ورودی نمی خواند. این تابع فرآیند خواندن ورودی را به محض رخ دادن کارکتر فضای خالی، form feed ، تب عمودی ، خط جدید و یا carriage return متوقف می کند. فرض کنید “Melec.ir Tutorials” به عنوان ورودی داده شود، تابع scanf کل این رشته را نمی خواند زیرا بین دو کلمه کارکتر فضای خالی وجود دارد. تابع scanf تنها Melec.ir را می خواند.

برای خواندن یک رشته حاوی فضای خالی ، از تابع ()gets استفاده می کنیم. تابع gets فضاهای خالی را نادیده می گیرد. این تابع فرآیند خواندن را هنگام رسیدن به کارکتر خط جدید(کلید Enter فشرده شود)  متوقف می کند. برای مثال:

#include <stdio.h>

int main() {

char full_name[25];

printf("Enter your full name: ");

gets(full_name);

printf("My full name is %s ",full_name);

return 0;

}

خروجی:

Enter your full name: Dennis Ritchie

My full name is Dennis Ritchie

جایگزین امن تر برای تابع gets() تابع fgets() است که تعداد مشخصی کارکتر را می خواند. مثلاً

#include <stdio.h>

int main() {

char name[10];

printf("Enter your  name plz: ");

fgets(name, 10, stdin);

printf("My name is %s ",name);

return 0;}

خروجی:

Enter your name plz: Carlos

My name is Carlos

آرگومان های ()fgets عبارتند از:

  • نام رشته،
  • تعداد کارکترهای خوانده شده
  • stdin به این معنی است که عمل خواندن باید از ورودی استاندارد که صفحه کلید است صورت پذیرد.

رشته خروجی: چاپ/نمایش یک رشته

تابع استاندارد printf  برای چاپ یا نمایش یک رشته روی دستگاه خروجی استفاده می شود. فرمت دهنده مورد استفاده %s است.

مثال

printf("%s", name);

خروجی رشته ای با استفاده از توابع fputs() یا printf() انجام می شود.

تابع ()fputs

تابع fputs() به نام رشته و اشاره گری که به محل مورد نظر برای چاپ متن متن اشاره می کند، نیاز دارد. از stdout که به خروجی استاندارد یعنی صفحه نمایش اشاره دارد استفاده می کنیم.برای مثال:

#include <stdio.h>

int main()

{char town[40];

  printf("Enter your town: ");

  gets(town);

  fputs(town, stdout);

  return 0;}

خروجی:

Enter your town: New York

New York

تابع ()puts

تابع puts رشته را روی دستگاه خروجی چاپ کرده و مکان نما(cursor) را به مکان اول باز می گرداند. تابع puts را می توان به روش زیر بکار برد:

#include <stdio.h>

int main() {

char name[15];

gets(name);        //reads a string

puts(name);        //displays a string

return 0;}

طرز استفاده از این تابع در مقایسه با دیگر توابع ساده است.

مطلب پیشنهادی:  تخصیص حافظه پویا در C با malloc ، calloc ، realloc و free

کتابخانه string

کتابخانه استاندارد ‘C’ توابع متنوعی برای اعمال روی رشته ها فراهم آورده است. این توابع  گرداننده رشته ها(string handlers) نیز نامیده می شوند. همه این گرداننده ها درون هدرفایل <string.h> ارائه شده اند:

تابع هدف

strlen()

این تابع برای یافتن طول یک رشته بکار می رود. این تابع تعداد کارکترهای درون یک رشته منهای کارکتر NULL را بر می گرداند.

strcat(str1, str2)

این تابع برای اتصال دو رشته به همدیگر و تشکیل یک رشته منفرد بکار می رود. این تابع رشته str2 را به انتهای رشته str1  ضمیمه کرده و یک اشاره گر به str1 برمی گرداند.

strcmp(str1, str2)

 

 

این تابع برای مقایسه دو رشته بکار می رود. اگر str1 برابر str2  باشد مقدار 0 ، اگر str1<str2 مقدار کمتر از 0 و اگر str1<str2 بزرگتر از 0 برمیگرداند.

 

برنامه زیر را برای نمایش توابع کتابخانه ملاحظه کنید:

#include <stdio.h>

#include <string.h>

int main () {

//string initialization

char string1[15]="Hello";

char string2[15]=" World!";

char string3[15];

int val;




//string comparison

val= strcmp(string1,string2);

if(val==0){

    printf("Strings are equal\n");

}

else{

    printf("Strings are not equal\n");

}




//string concatenation

printf("Concatenated string:%s",strcat(string1,string2)); //string1 contains hello world!




//string length

printf("\nLength of first string:%d",strlen(string1));

printf("\nLength of second string:%d",strlen(string2));




//string copy

printf("\nCopied string is:%s\n",strcpy(string3,string1));  //string1 is copied into string3

return 0;

}

خروجی:

Strings are not equal

Concatenated string:Hello World!

Length of first string:12

Length of second string:7

Copied string is:Hello World!

توابع مهم دیگر این کتابخانه عبارتند از:

  • (Strncmp(str1, str2, n: این تابع اگر nکارکتر اول str1 برابر nکارکتر اول str2 باشد مقدار 0، str1<str2 مقدار کمتر از 0 و str1>str2 مقدار بزرگتر از 0 را برمیگرداند.
  • (Strncpy(str1, str2, n این تابع برای کپی کردن یک رشته درون رشته دیگر بکار می رود. nکارکتر اول str2 را در str1 کپی می کند.
  • (Strchr(str1, c: یک اشاره گر به محل اولین وقوع کارکتر C در رشته str1 برمی گرداند، و اگر کارکتر پیدا نشود مقدار NULL برمی گرداند.
  • (Strstr(str1, str2 یک اشاره گر به مکان اولین وقوع str2 درون str1 را بر می گرداند، و اگر str2 پیدا نشود مقدار NULL را برمیگرداند.
  • Strcat(str1, str2, n) : n کارکتر اول str2 را به انتهای str1 افزوده و یک اشاره گر به رشته  str1 برمیگرداند.
  • ()Strlwr: برای تبدیل یک رشته به حروف کوچک
  • ()Strupr: برای تبدیل یک رشته به حروف بزرگ
  • ()Strev: برای معکوس کردن یک رشته

تبدیل یک رشته به یک عدد

در زبان برنامه نوویسی C ، برای اجتناب از خطای زمان اجرا می توان یک رشته از کارکترهای عددی را به یک مقدار عددی تبدیل کرد. کتابخانه stdio.h شامل توابع زیر برای تبدیل یک رشته به یک عدد است:

  • (Int atoi(str برای تبدیل ASCII به integer ، str را به معادل int آن تبدیل می کند. اگر کارکتر اول عدد نباشد و یا هیچ عددی در رشته نباشد مقدار 0 را برمیگرداند.
  • (double atof(str برای تبدیل ASCII به float ، str را به معادل float آن تبدیل می کند. اگر کارکتر اول عدد نباشد و یا هیچ عددی در رشته نباشد مقدار 0 را برمیگرداند
  • (long int atol(str: برای تبدیل ASCII به long int ، str را به معادل long integer تبدیل می کند. اگر کارکتر اول عدد نباشد و یا هیچ عددی در رشته نباشد مقدار 0 را برمیگرداند.
  • برنامه زیر طرز استفاده از تابع ()atoi را نشان می دهد:
#include <stdio.h>

int main()

{char *string_id[10];

  int ID;

  printf("Enter a number: ");

  gets(string_id);

  ID = atoi(string_id);

   printf("you enter %d  ",ID);

  return 0;}

خروجی:

Enter a number: 221348

you enter 221348
  • اعلان اشاره گر رشته ای مانند char *string=”language” یک ثابت بوده و قابل تغییر نیست.

خلاصه

  • یک رشته یک دنباله کارکتری بوده که در یک آرایه کارکتری ذخیره می شود.
  • یک رشته یک متن محصور درون علامت دابل کوتیشن می باشد.
  • یک کارکتر مانند ‘d’ یک رشته نیست و با یک تک کوتیشن مشخص می شود.
  • زبان ‘C’ توابع استانداردی برای اعمال دستکاری روی رشته ها در برنامه گردآوری کرده است.این توابع رشته ای در هدرفایل <string.h> ذخیره شده اند.
  • یک رشته باید قبل از استفاده در برنامه اعلان و مقداردهی اولیه شده باشد.
  • توابع ورودی و خروجی رشته ای مختلفی وجود دارد که هرکدام ویژگی های خود را دارند.
  • برای استفاده از توابع کتابخانه ای ضمیمه کردن آن را فراموش نکنید.
  • می توان با استفاده از توابع ()atoi()، atof، و ()atol رشته را به عدد تبدیل کرد. این توابع برای فرآیند کدینگ و دکدینگ بسیار مفید هستند.
  • می توان رشته های مختلفی را با تعریف یک آرایه رشته ای گردآوری کرد.

اگر این نوشته‌ برایتان مفید بود لطفا کامنت بنویسید.

مطالعه دیگر جلسات این آموزش<< جلسه قبلی                    جلسه بعدی >>
مطلب پیشنهادی:  کلیدواژه ها، ثابت ها، متغیرها و انواع داده ها در C

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *