وب سایت مهندسی نرم افزار

انجمن علمی دانشجویی مهندسی کامپیوتر دانشگاه شهید چمران اهواز


نویسنده: jafar
بازدید: 7730

کار با رشته ها و کتابخانه‌ی string.h در c


کتابخونه‌ی string.h در زبان c توابعی رو در اختیار برنامه نویس ها قرار میده که با اونها پردازش روی رشته های متنی بسیار ساده تر میشه.

اما قبل از اون یک مثال از رشته ها رو با هم مرور میکنیم.

 

همونطور که میدونید در زبان c رشته ها مجموعه ای از کاراکتر ها هستن که کاراکتر آخرش null یا همون 0\ هست. حالا چرا 0\  میذارن؟ خلاصش میشه 0\ برای زمانیه که بخوایم کد اسکی برای نمایش یک حرف بزاریم و کد اسکی عدد 0 میشه null برای همین برای نمایش آخرین کاراکتر از این علامت استفاده میشه.

 

 

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

char str1[] = {'a','b','c','\0'};
char str2[] = "abc";

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

 

 

 

مقدار این دو رشته با هم برابر هست. برای بدست آوردن طول این دو رشته میتونیم از تابع sizeof استفاده کنیم:

char str2[] = "abc";

printf("%d",sizeof(str1));

خروجی این کد میشه عدد 4 ! چرا؟ چون کاراکتر آخر null هست و قسمتی از آرایه محسوب میشه، بنابراین هروقت بخوایم از تابع sizeof برای بدست آوردن طول رشته استفاده کنیم باید یکی از مقدار اون کم کنیم.

دقت کنید که تابع sizeof تعداد بایت های اشغال شده رو برمیگردونه، پس اگه متن abc رو در یک آرایه‌ی به طول 10 قرار بدیم تابع sizeof عدد 10 رو برمیگردونه. در این مثال چون مقدار آرایه به صورت خودکار هم اندازه با طول رشته ما هست مشکلی پیش نمیاد اما برای حساب کردن طول واقعی یک رشته متنی از تابع strlen() استفاده میشه که در ادامه راجع بهش صحب میکنیم.

 

حالا یه مثال حل کنیم:

برنامه ای که یک رشته را در رشته ای دیگر پیدا کند، در صورتی که رشته پیدا شد ایندکس آن در رشته ی مورد جستجو و در غیر این صورت عدد -1 را در خروجی برگرداند.

    char haystack[] = "I'm a long string, can you search in my characters?";
    char needle[]   = "search";

 

خب قراره ما توی رشته‌ی haystack بگردیم و مقدار رشته ی needle که همون کلمه ی "search" هست رو پیدا کنیم.

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

int i,j,index = -1 , flag=0;

int h_len = sizeof(haystack) - 1 ;

int n_len = sizeof(needle)   - 1 ;


حالا باید یه حرف یه حرف توی haystack بگردیم ببینیم کجا حرف اول برابر با حرف اول needle میشه؟ اگه چنین شرطی برقرار بود بقیه کارمون رو انجام میدیم، اما تا چه زمانی باید این کار رو انجام بدیم؟

تا زمانی که موقع چک کردن شرط برابر بودن حرف های اول، ایندکس اولین حرف در haystack + طول needle کمتر از کل طول haystack بشه، پس شرط حلقه رو اینطوری تعریف میکنیم:

 

    for(i=0 ; i<h_len - n_len ; i++){

 

حالا چک میکنیم ببینیم آیا کاراکتر i ام در haystack با کاراکتر اول در needle برابر هست یا خیر؟

 if(haystack[i] == needle[0]){

 

اگه برابر بود مقدار flag رو 1 میکنیم به این معنی که فرض میکنیم مقدار needle در haystack پیدا شده و شروع میکنیم به چک کردن بقیه کاراکتر ها، در صورتی که دو کاراکتر مقادیر یکسانی نداشتن مقدار flag رو 0 میکنیم و break انجام میدیم.

 

flag = 1;
            for(j=1;j<n_len;j++){
                if(haystack[i+j] != needle[j] ){
                    flag=0;
                    break;
                }
            }

 

در غیر این صورت ادامه میدیم و بقیه کارکتر های needle رو چک میکنیم. در پایان حلقه ی در صورتی که flag هنوز 1 بود (یعنی needle پیدا شده) مقدار i رو در index قرار میدیم و از حلقه ی اصلی خارج میشیم.

if(flag){
    index = i ;
    break;
}

 

 

 

 

 

 کد کامل:

 

int main(){

    char haystack[] = "I'm a long string, can you search in my characters?";
    char needle[]   = "search";


    int i,j,index = -1 , flag=0;

    int h_len = sizeof(haystack) - 1 ;
    int n_len = sizeof(needle)   - 1 ;

    for(i=0;i<(h_len - n_len);i++){

        if(haystack[i] == needle[0]){
            flag = 1;
            for(j=1;j<n_len;j++){
                if(haystack[i+j] != needle[j] ){
                    flag=0;
                    break;
                }
            }

            if(flag){
                index = i ;
                break;
            }
        }

    }

    printf("%d",index);




    return 0;
}

 

 خب بریم برای کار با کتابخونه‌ی string.h

 

ابتدا اون رو در برنامه خودمون اضافه میکنیم:

#include <string.h>

 

معرفی توابع کاربردی همراه با مثال:

1- تابع strlen

strlen ( const char * str );

 

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

مثال:

#include <string.h>

int main(){

    char str1[] = "test1";
    char str2[100] = "test22";
    char str3[50] = {'t','e','s','t','3','3','3','\0'};
    int l1 = strlen(str1);
    int l2 = strlen(str2);
    int l3 = strlen(str3);

    printf("str1:%d \nstr2:%d \nstr3:%d ",l1,l2,l3);

    return 0;
}

 

خروجی:

str1:5
str2:6
str3:7

 

 

 

2- تابع strcmp

strcmp(const char *str1, const char *str2)

 

این تابع دو رشته از ورودی دریافت میکنه، اگه کاملا مثل هم بودن عدد 0 رو برمیگردونه، در غیر این صورت با توجه به کد اسکی اولین کاراکتر متفاوت قضاوت میکنه که کدوم رشته بزرگتره.

مثال:

#include <string.h>

int main(){

    char str1[] = "test";
    char str2[] = "test";


    char str3[] = "abc";
    char str4[] = "zef";

    char str5[] = "test11";
    char str6[] = "test1";


    printf("\n1- Compare result: %d ",strcmp(str1,str2));

    printf("\n2- Compare result: %d ",strcmp(str3,str4));

    printf("\n3- Compare result: %d ",strcmp(str5,str6));


    return 0;
}

خروجی:

1- Compare result: 0
2- Compare result: -1
3- Compare result: 1

 

 

3- تابع strcpy

char *strcpy(char *dest, const char *src)

این تابع دو رشته از ورودی دریافت میکند و مقدار رشته‌ی دوم  را در رشته ی اول (در صورتی که طول رشته‌ی اول کمتر از رشته‌ی دوم نباشد) ذخیره میکند. خروجی تابع اشاره گری به رشته‌ی اول هست که معمولا استفاده نمیشه.

مثال:

#include <string.h>


int main(){



    char t1[] = "Test1";
    char t2[] = "Test2";
    strcpy(t1,t2);

    printf("%s : %s",t1,t2);

    return 0;
}

 

خروجی:

Test2 : Test2

 

4- تابع strcat

char * strcat ( char * destination, const char * source );

این تابع دو رشته از ورودی دریافت میکند و مقدار رشته‌ی دوم  را در ادامه‌ی رشته ی اول (در صورتی که طول رشته‌ی اول با حاصل جمع طول رشته‌ی دوم تمام نشود) ذخیره میکند. خروجی تابع اشاره گری به رشته‌ی اول هست که معمولا استفاده نمیشه.

 

مثال:

#include <string.h>


int main(){


    char dest[100] = "Hello";
    char src[] = "World";

    strcat(dest," ");
    strcat(dest,src);
    strcat(dest,"!");

    printf("%s",dest);

    return 0;
}

خروجی:

 

 

برای تحقیق بیشتر راجع به این کتابخونه کافیه عبارت "string.h in c" رو در گوگل سرچ کنید.

در صورت وجود سوال میتونید در همین بخش سوالتون رو بپرسین.

 

jafar
1393 عضو از سال

درباره نویسنده:


جعفر آخوندعلی در حال حاضر در دوره ی کارشناسی رشته ی نرم افزار مشغول تحصیل در دانشگاه شهید چمران است.
برای تماس با او میتونید از طریق ایمیل jafar.akhondali@yahoo.com اقدام کنید.
برای نظر دادن باید وارد شوید،
عضو نیستید؟ از اینجا در کمتر از 20 ثانیه ثبت نام کنید :)