دوست عزیز، به سایت علمی نخبگان جوان خوش آمدید

مشاهده این پیام به این معنی است که شما در سایت عضو نیستید، لطفا در صورت تمایل جهت عضویت در سایت علمی نخبگان جوان اینجا کلیک کنید.

توجه داشته باشید، در صورتی که عضو سایت نباشید نمی توانید از تمامی امکانات و خدمات سایت استفاده کنید.
نمایش نتایج: از شماره 1 تا 8 , از مجموع 8

موضوع: توابع کتابخانه ای رشته ای

  1. #1
    دوست آشنا
    رشته تحصیلی
    C@/\/\P\/T(-R
    نوشته ها
    1,138
    ارسال تشکر
    8,061
    دریافت تشکر: 4,739
    قدرت امتیاز دهی
    7121
    Array
    Outta_Breathe1020's: جدید59

    پیش فرض توابع کتابخانه ای رشته ای

    زبان C داراي يك كتابخانه غني از توابع كار با رشته ها است. پيش تعريف اين توابع در فايل سرآمد string.h آمده است.
    در اين قسمت چندين تابع از كتابخانه C به همراه الگوريتم آنها بررسي مي گردند.
    هدف از بررسي الگوريتم اين توابع، آشنايي بيشتر با نحوه كار با رشته ها مي باشد. دقت كنيد كه ممكن است تعريف دقيق تابع كتابخانه اي در C با آنچه كه در اينجا آورده می شود، كمي متفاوت باشد.

    نكته بسيار مهمي كه در هنگام بررسي اين توابع بايد بدان توجه داشته باشيد، اين است كه هيچ يك از آنها حدود آرايه (اندازه آرايه) را بررسي نمي كنند. بنابراين اين وظيفه خود برنامه نويس است كه آرايه هايي با اندازه مناسب را به توابع ارسال كند.
    و مجازات تخفیف یافته ات این بار حبس ابد در این دنیاست...!!!

    Nearly 1 billion people go to bed hungry every night and every year 2 million children die from malnutrition

    شاید صدای مرگ بود که میگفت: تو هم اگر قاتل نباشی، سارق حیات این ها بوده ای...

  2. 4 کاربر از پست مفید Outta_Breathe1020 سپاس کرده اند .


  3. #2
    دوست آشنا
    رشته تحصیلی
    C@/\/\P\/T(-R
    نوشته ها
    1,138
    ارسال تشکر
    8,061
    دریافت تشکر: 4,739
    قدرت امتیاز دهی
    7121
    Array
    Outta_Breathe1020's: جدید59

    پیش فرض strlen

    نام اين تابع مخفف string length مي باشد. اين تابع يك رشته را دريافت كرده و طول آن را باز مي گرداند. مسلما منظور از طول رشته، تعداد كاراكترهاي آن تا رسيدن به null است. تعريف اين تابع در زير آمده است:

    کد:
    
     int strlen(const char string[]) {
       int i;
       for (i=0; string[i]; i++) ;
       return(i);
    }

    دقت در تابع بالا نكات جالب را به ما نشان مي دهد. متغير string بصورت ثابت ارسال شده است تا در داخل تابع بطور ناخواسته تغيير داده نشود. دقت كنيد كه ; پس از حلقه for نشان مي دهد كه بدنه اين حلقه، خالي است. به اين معنا كه در هربار اجراي حلقه، فقط عمليات مربوط به خود حلقه يعني افزايش شمارنده و بررسي شرط صورت مي پذيرد. علاوه براين شرط ادامه حلقه فقط string[i] قرار داده شده است كه توسط ‍C اينگونه تفسير مي شود : "تا زمانيكه string[i] درست است". مي دانيد كه هر عدد بجز 0 درست محسوب مي گردد، بنابراين تا هنگامي كه string[i] برابر null (كه همانطور كه گفته شد برابر كد اسكي 0 مي باشد) نباشد، درست محسوب مي گردد. به محض اينكه string[i] به null برسد، نادرست ارزيابي شده و حلقه خاتمه خواهد يافت. مسلما در اين حالت مقدار متغير i، طول آرايه را نشان مي دهد. مي توانستيم حلقه for را بصورت زير نيز بنويسيم:

    کد:
    
     for (i=0; string[i] != '\0'; i++);



    برنامه زير نحوه استفاده از strlen را نشان مي دهد: (دريافت برنامه)


    کد:
    
    void main() {
       char  text[100];
       int len;
    
       printf("enter a text : ");
       gets(text);
       len = strlen(text);
       printf("length of your text is %d",len);
    }
     
    

    و مجازات تخفیف یافته ات این بار حبس ابد در این دنیاست...!!!

    Nearly 1 billion people go to bed hungry every night and every year 2 million children die from malnutrition

    شاید صدای مرگ بود که میگفت: تو هم اگر قاتل نباشی، سارق حیات این ها بوده ای...

  4. 3 کاربر از پست مفید Outta_Breathe1020 سپاس کرده اند .


  5. #3
    دوست آشنا
    رشته تحصیلی
    C@/\/\P\/T(-R
    نوشته ها
    1,138
    ارسال تشکر
    8,061
    دریافت تشکر: 4,739
    قدرت امتیاز دهی
    7121
    Array
    Outta_Breathe1020's: جدید59

    پیش فرض strcpy

    نام اين تابع مخفف sring copy مي باشد. اين تابع دو رشته را دريافت و رشته دوم را در رشته اول كپي مي كند. تعريف اين تابع در زير آمده است:
    کد:
    
    void strcpy(char dest[], const char source[]) {
       int i;
       for (i=0; source[i]; i++)
            dest[i] = source[i] ;
       dest[i] = '\0' ;
    }

    پارامتر dest، رشته مقصد را نشان مي دهد كه رشته source در آن كپي خواهد شد. از آنجا كه پارامتر source نبايد تغيير كند، بصورت ثابت ارسال شده است. حلقه for تا زمانيكه source[i] به null نرسيده تكرار مي شود و عناصر رشته source را تك به تك در رشته dest كپي مي نمايد. دقت كنيد كه به محض اينكه source[i] به null برسد، حلقه خاتمه مي يابد، در نتيجه خود كاراكتر '\0' در dest كپي نخواهد شد. به همين دليل در انتها، آخرين عنصر آرايه dest برابر'\0' قرار داده شده است.

    برنامه زير نحوه استفاده از اين تابع را نشان مي دهد: (دريافت برنامه)
    کد:
    
    void main() {
       char string1[20], string2[20] ;
     
       printf("Please enter string1 : ");
       gets(string1) ;
      
       strcpy(string2, string1) ;
       printf("copy string1 into string2n");
       printf("now string1 = %s and string2 = %sn", string1, string2);
     
       strcpy(string1,"new") ;
       printf("copy new into string1n");
       printf("now string1 = %s", string1);
    }
    

    و مجازات تخفیف یافته ات این بار حبس ابد در این دنیاست...!!!

    Nearly 1 billion people go to bed hungry every night and every year 2 million children die from malnutrition

    شاید صدای مرگ بود که میگفت: تو هم اگر قاتل نباشی، سارق حیات این ها بوده ای...

  6. 4 کاربر از پست مفید Outta_Breathe1020 سپاس کرده اند .


  7. #4
    دوست آشنا
    رشته تحصیلی
    C@/\/\P\/T(-R
    نوشته ها
    1,138
    ارسال تشکر
    8,061
    دریافت تشکر: 4,739
    قدرت امتیاز دهی
    7121
    Array
    Outta_Breathe1020's: جدید59

    پیش فرض strcat

    نام اين تابع مخفف string concat است. اين تابع دو رشته را دريافت و رشته دوم را به انتهاي رشته اول الحاق مي كند. به تعريف اين تابع دقت كنيد:

    کد:
    void strcat(char str1[], const char str2[]) {
       int i, j ;
     
       for (i=0; str1[i]; i++) ;
     
       for (j=0; str2[j]; j++)
            str1[i+j] = str2[j] ;
       str1[i+j] = '\0' ;
    }

    در تابع فوق، قصد داريم رشته str2 را به انتهاي رشته str1 اضافه كنيم. حلقه for اول، دقيقا همانند تابع strlen است و طول رشته str1 محاسبه و در متغير i قرار مي دهد. سپس در حلقه for دوم، از ابتداي رشته str2 شروع كرده و هر كاراكتر را به انتهاي رشته str1 اضافه مي كنيم. در پايان كاراكتر '\0' نيز به انتهاي رشته str1 الحاق مي گردد.

    براي آشنايي با نحوه فراخواني اين تابع، به برنامه زير دقت كنيد: (دريافت برنامه)

    کد:
    void main() {
       char string1[20], string2[20] ;
     
       printf("please enter string1 : ");
       gets(string1);
       printf("please enter string2 : ");
       gets(string2);
     
       strcat(string1,string2);
       printf("concatenate of string1 and string2 is : %s", string1) ;
    }

    و مجازات تخفیف یافته ات این بار حبس ابد در این دنیاست...!!!

    Nearly 1 billion people go to bed hungry every night and every year 2 million children die from malnutrition

    شاید صدای مرگ بود که میگفت: تو هم اگر قاتل نباشی، سارق حیات این ها بوده ای...

  8. 2 کاربر از پست مفید Outta_Breathe1020 سپاس کرده اند .


  9. #5
    دوست آشنا
    رشته تحصیلی
    C@/\/\P\/T(-R
    نوشته ها
    1,138
    ارسال تشکر
    8,061
    دریافت تشکر: 4,739
    قدرت امتیاز دهی
    7121
    Array
    Outta_Breathe1020's: جدید59

    پیش فرض strcmp

    نام اين تابع مخفف string compare است. اين تابع دو رشته را دريافت و پس از مقايسه آنها يكي از 3 مقدار زير را باز مي گرداند:
    - در صورتيكه مساوي باشند : 0
    - در صورتيكه رشته اول بزرگتر باشد : 1+
    - درصورتيكه رشته اول كوچكتر باشد : 1-

    نحوه مقايسه دو رشته، به همان ترتيبي است كه يك لغتنامه كلمات را مرتب مي كند. يعني ابتدا حروف اول دو رشته مقايسه مي شود، اگر يكي از آنها بزرگتر بود كه نتيجه بازگردانده مي شود. اما در صورتيكه حروف اول دو رشته يكسان بود، حروف دوم با يكديگر مقايسه مي شوند و اين عمل تا زمانيكه يك اختلاف بين دو رشته پيدا شود ادامه مي يابد. در صورتيكه هيچ اختلافي بين دو رشته پيدا نشد، مقدار 0 باز گردانده مي شود. پياده سازي اين تابع در زير آمده است:
    کد:
    
    int strcmp(const char str1[], const char str2[]) {
       int i;
     
       i = -1;
       do {
          i ++;
          if (str1[i] > str2[i]) return(1);
          if (str1[i] < str2[i]) return(-1) ;
       } while (str1[]) ;
       return(0);
    }

    تابع فوق دو رشته str1 و str2 را با يكديگر مقايسه مي كند. از آنجا كه هيچيك از اين دو نبايد تغيير داده شوند، هردو بصورت ثابت به تابع ارسال شده اند. حلقه do-while عناصر اين دو رشته را با يكديگر مقايسه ميكند. توجه كنيد كه عمل مقايسه براي كاراكترها در زبان تعريف شده و در حقيقت كد اسكي آنها را با يكديگر مقايسه مي كند. در هربار اجراي حلقه، چنانچه يكي از كاراكترها بزرگتر بود، بلافاصله حاصل بازگردانده مي شود، اما درصورتيكه هردو مساوي باشند، حلقه دور زده و عمليات تكرار مي شود. به محض اينكه str[i] به null برسد (كه در اينصورت str2[i] هم قطعا به null رسيده است، چراكه هر دو مساوي بوده اند) از حلقه خارج شده و مقدار 0 را به نشانه تساوي دو رشته باز مي گرداند.
    براي آشنايي بيشتر به برنامه زير و اجراهاي مختلف آن توجه كنيد: (دريافت برنامه)
    کد:
    
     
    void main() {
       char string1[20], string2[20] ;
       int result;
     
       printf("please enter string1 : ");
       gets(string1);
       printf("please enter string2 : ");
       gets(string2);
     
       result = strcmp(string1,string2);
       if (result == 0) 
           printf("%s equals %sn", string1, string2) ;
       else if (result == 1) 
                 printf("%s is grater than %sn", string1, string2) ;
              else  printf("%s is less than %sn", string1, string2) ;
     
    }

    و مجازات تخفیف یافته ات این بار حبس ابد در این دنیاست...!!!

    Nearly 1 billion people go to bed hungry every night and every year 2 million children die from malnutrition

    شاید صدای مرگ بود که میگفت: تو هم اگر قاتل نباشی، سارق حیات این ها بوده ای...

  10. 3 کاربر از پست مفید Outta_Breathe1020 سپاس کرده اند .


  11. #6
    دوست آشنا
    رشته تحصیلی
    C@/\/\P\/T(-R
    نوشته ها
    1,138
    ارسال تشکر
    8,061
    دریافت تشکر: 4,739
    قدرت امتیاز دهی
    7121
    Array
    Outta_Breathe1020's: جدید59

    پیش فرض strstr

    اين تابع دو رشته را دريافت و در رشته اول به دنبال رشته دوم جستجو مي كند و در صورت پيدا شدن، مكان اولين كاراكتر آن را باز مي گرداند. در صورتيكه در رشته اول چندين نمونه از رشته دوم وجود داشته باشد، مكان اولين نمونه را باز مي گرداند. پياده سازي اين تابع در زير آمده است:

    کد:
    
    void strstr(const char str1[], const char str2[]) {
       int i, j ;
     
       for (i=0; str1[i]; i++) 
           if (str1[i] == str2[0]) {
               for (j=1; str2[j] && str1[i+j] == str2[j] ; j++) ;
               if (!str2[j]) return(i);
           }
      
       return(-1) ;
    }
     

    درك نحوه كار اين تابع نياز به دقت دارد. حلقه for اول تك تك عناصر str1 را با اولين عنصر str2 مقايسه مي كند. چنانچه يكي از اين عناصر با str2[0] برابر بود، آنگاه حلقه for دوم شروع به مقايسه عناصر بعدي str1 (از محل i به بعد) و str2 (از محل 0 به بعد) مي نمايد. به شرط حلقه for دوم دقت كنيد. اين حلقه تا زمانيكه str2 به انتها نرسيده و همچنين عنصر بعدي str2 و str1 با يكديگر برابر باشند، تكرار مي گردد. دقت كنيد كه بدنه حلقه خالي است. بعد از پايان حلقه بررسي مي گردد كه چنانچه دليل خروج از حلقه به پايان رسيدن str2 بوده است (يعني str2[j] برابر null شده است)، بنابراين رشته مورد نظر پيدا شده و مكان شروع آن يعني i بازگردانده مي شود. در غير اينصورت، دليل خروج مساوي نبودن دو كاراكتر از دو رشته بوده است، بنابراين عمليات جستجو ادامه مي يابد. البته تابع فوق بهينه نيست. چرا كه هنگامي كه در رشته اول، شمارنده به مكاني برسد كه تعداد كاراكترهاي باقيمانده تا پايان رشته كمتر از اندازه رشته دوم باشد، قطعا ادامه جستجو لزومي ندارد، چرا كه رشته دوم پيدا نخواهد شد.

    براي روشن شدن موضوع، به برنامه زير دقت كنيد:(دريافت برنامه)
    کد:
    
    void main() {
       char text[100], word[20];
       int i, n, result ;
     
       printf("enter a text : ");
       gets(text) ;
       printf("how many words do you have : ");
       scanf("%d",&n) ;
     
       for (i=0; i<n; i++) {
          printf("enter a word to search : ") ;
          gets(word);
          result = strstr(text, word) ;
          if (result == -1) 
              printf("(%s) not foundn",word);
          else printf("(%s) is founded in position %dn", word, result);
       }
    }

    و مجازات تخفیف یافته ات این بار حبس ابد در این دنیاست...!!!

    Nearly 1 billion people go to bed hungry every night and every year 2 million children die from malnutrition

    شاید صدای مرگ بود که میگفت: تو هم اگر قاتل نباشی، سارق حیات این ها بوده ای...

  12. 3 کاربر از پست مفید Outta_Breathe1020 سپاس کرده اند .


  13. #7
    دوست آشنا
    رشته تحصیلی
    C@/\/\P\/T(-R
    نوشته ها
    1,138
    ارسال تشکر
    8,061
    دریافت تشکر: 4,739
    قدرت امتیاز دهی
    7121
    Array
    Outta_Breathe1020's: جدید59

    پیش فرض strrev

    نام اين تابع مخففstring reverse است. اين تابع يك رشته را دريافت و آن را معكوس مي نمايد. پياده سازي اين تابع در زير آمده است.
    کد:
    
    void strrev(char string[]) {
       int i, j, l;
       char temp;
     
       for (l=0; string[l]; l++) ;
     
       for (i=0, j=l-1; i<j; i++, j--) {
          temp = string[i] ;
          string[i] = string[j] ;
          string[j] = temp ;
       }
    }


    تابع فوق يك رشته را از طريق پارامتر string دريافت و آن را معكوس مي نمايد. حلقه for اول طول رشته را محاسبه و در متغير l قرار مي دهد. سپس در حلقه for دوم، متغير i از ابتداي رشته شروع به حركت رو به جلو، و متغير j از انتهاي رشته شروع به حركت رو به عقب مي نمايند و در حين حركت جاي عناصر متناظر خود را با يكديگر عوض مي كنند. اينكار تا زمانيكه i و j به يكديگر برسند تكرار مي شود. شكل زير نحوه انجام كار را براي رشته "counter" نشان مي دهد.


    برنامه زير نحوه كار اين تابع را نشان مي دهد: (دريافت برنامه)
    کد:
    
    void main() {
       char word[20] ;
     
       printf("enter a word : ");
       gets(word) ;
       printf("reverse of %s is ", word);
       strrev(word);
       printf("%s",word) ;
    }
     

    و مجازات تخفیف یافته ات این بار حبس ابد در این دنیاست...!!!

    Nearly 1 billion people go to bed hungry every night and every year 2 million children die from malnutrition

    شاید صدای مرگ بود که میگفت: تو هم اگر قاتل نباشی، سارق حیات این ها بوده ای...

  14. #8
    دوست آشنا
    رشته تحصیلی
    C@/\/\P\/T(-R
    نوشته ها
    1,138
    ارسال تشکر
    8,061
    دریافت تشکر: 4,739
    قدرت امتیاز دهی
    7121
    Array
    Outta_Breathe1020's: جدید59

    پیش فرض تابع atoi

    نام اين تابع مخفف ascii to integer مي باشد و در فايل سرآمد stdlib.h تعريف شده است. اين تابع يك رشته را دريافت و آن را تبديل به عدد مي كند. البته مسلما رشته بايد منحصرا از ارقام و علامت + يا – تشكيل شده باشد. بعنوان مثال چنانچه رشته "3478" را به آن بدهيم، عدد 3478 را باز خواهد گرداند. چنانچه رشته ورودي قابل تبديل به عدد نباشد (بدليل وجود كاراكترهاي غيرمجاز مانند حروف)، تابع مقدار 0 باز خواهد گرداند. پياده سازي اين تابع در زير آمده است: (دريافت برنامه)
    کد:
    int atoi(const char string[]) {
       int i=0 , sign=1, number=0;
     
       if (string[0] == '-') {
            sign = -1;
            i = 1;
       }
       else if (string[0] == '+') 
                i = 1;
     
       for (; string[i]; i++)
            if (string[i]>'0' && string[i]<'9')
                number = number * 10 + (string[i] – 48) ; // or (string[i] – '0')
            else return(0);
      
       return(sign * number);
    }


    در تابع فوق، string رشته اي است كه قصد تبديل آن به عدد را داريم. متغير i شمارنده رشته است كه از 0 آغاز مي گردد و sign علامت عدد است كه بطور پيش فرض +1 درنظر گرفته مي شود. متغير number نيز مقدار عدد حاصل را در خود نگاه مي دارد. ابتدا بررسي مي شود اگر اولين عنصر آرايه string برابر '-' است، علامت عدد به -1 تغيير يافته و شمارنده رشته نيز يكي جلو مي رود. چنانچه اولين عنصر برابر '+' باشد، نيازي به تغيير علامت نيست ولي شمارنده رشته بايد جلو برود. سپس در داخل حلقه for، عناصر رشته string به ترتيب بررسي شده و درصورتيكه يك رقم باشند، به حاصل اضافه مي گردند و در غير اينصورت نيز مقدار 0 بازگردانده مي شود. دقت كنيد كه براي اضافه كردن يك كاراكتر رقمي به number، ابتدا از آن 48، كه كد اسكي كاراكتر 0 است، را كم مي كنيم تا مقدار عددي آن كاراكتر بدست آيد. بعنوان مثال كد اسكي '1' برابر 49 است و پس از كم كردن 48 از آن به رقم 1 مي رسيم. مي توان در برنامه بجاي عدد 48، كاراكتر '0' را از string[i] كم كرد. در ضمن number در ابتدا در 10ضرب مي شود و سپس با رقم جديد جمع مي شود تا رقم جديد در مكان يكان آن اضافه گردد.


    تابع ديگري بنام itoa نيز وجود دارد که يک عدد را دريافت و آن را تبديل به يک رشته مي کند. مي توانيد اين تابع را بعنوان تمرين بنويسيد.

    از همين دسته توابع، توابع مفيد ديگري همچون atof براي تبديل يک رشته به يک عدد اعشاري و atol براي تبديل يک رشته به يک عدد صحيح بزرگ نيز وجود دارند كه براي آشنايي با آنها مي توانيد به مستندات كامپايلر خود مراجعه كنيد.

    توابعي كه مورد بحث قرار گرفتند، ازجمله مهمترين توابعي بودند كه براي كار با رشته ها مورد نياز هستند. اما در فايل سرآمد string.h توابع مفيد ديگري نيز وجود دارند كه براي آشنايي با آنها به مستندات كامپايلر خود رجوع كنيد.
    و مجازات تخفیف یافته ات این بار حبس ابد در این دنیاست...!!!

    Nearly 1 billion people go to bed hungry every night and every year 2 million children die from malnutrition

    شاید صدای مرگ بود که میگفت: تو هم اگر قاتل نباشی، سارق حیات این ها بوده ای...

  15. کاربرانی که از پست مفید Outta_Breathe1020 سپاس کرده اند.


اطلاعات موضوع

کاربرانی که در حال مشاهده این موضوع هستند

در حال حاضر 1 کاربر در حال مشاهده این موضوع است. (0 کاربران و 1 مهمان ها)

موضوعات مشابه

  1. پاسخ ها: 4
    آخرين نوشته: 9th August 2014, 08:59 PM
  2. تصویر: jتصاویر حمله به اتوبوس تراکتورسازی در رشت
    توسط m.g.s.t.r در انجمن اخبار ورزشی
    پاسخ ها: 3
    آخرين نوشته: 8th February 2013, 09:11 PM
  3. پاسخ ها: 0
    آخرين نوشته: 15th August 2011, 03:49 PM
  4. آموزشی: آموزش فتوشاپ - اعمال خالکوبی بروی تصاویر در فتوشاپ
    توسط آبجی در انجمن آموزش و ابزارهای فتوشاپ
    پاسخ ها: 0
    آخرين نوشته: 30th June 2010, 11:32 PM
  5. پاسخ ها: 0
    آخرين نوشته: 12th November 2009, 07:39 PM

کلمات کلیدی این موضوع

مجوز های ارسال و ویرایش

  • شما نمیتوانید موضوع جدیدی ارسال کنید
  • شما امکان ارسال پاسخ را ندارید
  • شما نمیتوانید فایل پیوست کنید.
  • شما نمیتوانید پست های خود را ویرایش کنید
  •