این پست در حال بروز رسانی است.

رشته ها(Strings) مجموعه ای از کاراکتر ها هستند که برای نمایش پیغام ها، ذخیره اسامی و ... کاربرد دارند. این آموزش را میتوان در سی پلاس پلاس نیز استفاده کرد.

در زبان سی بر خلاف بسیاری از زبان ها برای حفظ سادگی زبان، نوع داده ای مبنایی برای ذخیره رشته ها وجود ندارد. در نتیجه شما باید رشته ها را بصورت آرایه ای از کاراکتر ها معرفی کنید.

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

char ch = 'A';

char یک نوع متغیر صحیح است که محدوده آن از 0 تا 255 می باشد و برای ذخیره کاراکتر های اسکی همین کافی است. در حال حاضر متغیر ch مقدار 65 را دارد که معادل A در جدول کاراکتر های اسکی است.

همانطور که گفته شد یک رشته را باید با استفاده از آرایه ها در زبان سی شبیه سازی بکنید:

char hello[] = "Hello";

اگر در حین معرفی آرایه تعداد عضو های آنرا مشخص نکنید( مانند کد بالا) اندازه آن برابر خواهد بود با طول رشته شما + 1 . برای مثال رشته hello در اینجا  6 کاراکتر طول دارد. 5 کاراکتر، کاراکتر هایی هستند که خودم مشخص کردم و کاراکتر ششم کاراکتر پوچ هست که در زبان سی پایان رشته را مشخص میکند. بهتر است همیشه حساب این را داشته باشید :)

اما بعد، رشته ها در زبان سی به دو صورت تعریف میشوند:

char *s = "Hello";
char s[6] = "Hello";

حالت اول یک اشاره گر را معرفی میکند که به اولین بایت رشته اشاره میکند. اما حالت دوم آرایه ای را با طولی مشخص تعین میکند.

ورودی و خروجی

مانند هر نوع دیگر رشته ها نیز باید به خروجی ارسال شوند یا از ورودی خوانده شوند. توابع و روش های مختلفی برای اینکار وجود دارند.

چاپ رشته در خروجی

دو تابع puts و printf برای اینکار وجود دارند. تابع puts یک رشته را به عنوان ورودی میگیرد و آنرا به همراه یک کاراکتر خط جدید در خروجی استاندارد مینویسد:

char *s = "Hello World!";
puts(s);

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

char *s = "Faroogh";
printf("name is %s",s);

توجه کنید که در استفاده از هر دو تابع تفاوتی نمیکند که رشته به چه روشی تعریف شده باشد. برای اطمینان کد های زیر را کامپایل کنید:

char s[] = "GNU";
puts(s);
printf("%s",s);

نکته ای دیگر اینکه خط سوم کد بالا، یعنی استفاده از تابع printf فقط برای چاپ یک رشته، در بسیاری از کامپایلر ها برای بهینه سازی با puts جایگزین میشود.[1]

دریافت رشته از ورودی

توابع scanf و gets برای اینکار وجود دارند، تابع gets منسوخ شده است پس در مورد آن توضیحی نمیدهم، در مورد scanf هم باید مراقب باشید رشته به اندازه ای طول دارد تا ورودی را در خود ذخیره بکند.

#include <stdio.h>

int main(){
char a[10] = {0};
scanf("%s", a);
printf("Hello %s\n", a);
return 0;
}

پردازش رشته ها

برای مقایسه،کپی،الحاق، جستجوی رشته ها نیز توابعی وجود دارد.این توابع همه در فایل سرآمد string.h هستند.

مقایسه رشته ها

تابع strcmp تک تک بایت های دو رشته را با هم مقایسه میکند و در صورت تطابق مقدار ۰ را پر میگرداند. تابعی مشابه به اسم strncmp نیز وجود دارد که تنها n کاراکتر اول را با هم مقایسه میکند.

#include <string.h>
#include <stdio.h>

int main(){
char *s1 = "Joe";
char *s2 = "Joe";
char *s3 = "John";
if (strcmp(s1, s2) == 0)
puts("s1 and s2 are the same");
if (strncmp(s1, s3, 2) == 0)
puts("two character from beginning of s1 and s3 are same");
return 0;
}