تحلیل کتابخانه

تحلیل و بررسی کتابخانه String.h

نوشته شده توسط علی زاهدی

کتابخانه String.h یکی از پر کاربرد ترین کتابخانه ها در زبان C و ++C است. این کتابخانه دارای توابعی است که به ما کمک می‌کند تا راحت تر بتوانیم با رشته ها کار کنیم. برای مثال مقایسه کردن دو رشته مختلف و یا کپی کردن یک رشته در رشته دیگر و … از جمله عملیات هایی هستند که توابع این کتابخانه می‌توانند برای ما انجام دهند. در این آموزش، همانند سلسله آموزش های تحلیل کتابخانه، به تشریح و تحلیل توابع کتابخانه String.h می پردازیم. در ادامه با مرجع تخصصی آردوینو به زبان فارسی، دیجی اسپارک همراه باشید.

 


نکات فنی کتابخانه String.h


این کتابخانه محدود به سخت افزار خاصی نیست و در اکثر پروژه هایی که به زبان C و ++C نوشته می‌شوند. کاربرد بسیاری دارد. توابع موجود در این کتابخانه برای کار آرایه ها و همچنین کاراکتر ها نوشته شده است. در پروژه هایی که رشته های طولانی در آن ذخیره و جابجا می‌شوند  این کتابخانه کاربرد بسیار زیادی دارد. این کتابخانه نیاز به نصب ندارد و تقریبا در همه کامپایلر هایی که بر پایه زبان های C و ++C هستند نصب می‌شود. برای استفاده از این کتابخانه ها در کامپایلر و یا IDE هایی مثل KEIL ،CodeVison ،Arduino IDE و … بایستی فایل هدر مربوط به کتابخانه را به برنامه خود اضافه کنید. با نوشتن دستور زیر در ابتدای برنامه این کتابخانه به کد شما اضافه می شود.

#include <string.h>

 


توابع کلیدی کتابخانه String.h


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

  • char *strcat(char *dest, const char *src)

این تابع  رشته stc را به انتهای زشته dest متصل می‌کند. و یک اشاره گر  به رشته  حاصل باز می‌گرداند. برای درک بهتر این مطلب به مثال زیر توجه کنید.

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

int main () {
   char src[50], dest[50];

   strcpy(src,  "Spark");
   strcpy(dest, "Digi");

   strcat(dest, src);

   printf("Final destination string : |%s|", dest);
   
   return(0);
}

خروجی کد بالا  به صورت زیر است.

Final destination string : |DigiSpark|
  • char *strcpy(char *dest, const char *src)

این تابع رشته src را در رشته dest کپی می‌کند. در کد زیر مقدار قرار گرفته در رشته dest برابر NULL است. و عبارت موجود در رشته src در رشته dest کپی می شود.

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

int main () {
   char src[40];
   char dest[100];
  
   memset(dest, '\0', sizeof(dest));
   strcpy(src, "This is Digispark.ir");
   strcpy(dest, src);

   printf("Final copied string : %s\n", dest);
   
   return(0);
}

خروجی کد بالا به صورت زیر است.

Final copied string : This is Digispark.ir
  • int strlen(char *str)

این تابع مقدار طول رشته را str را در خروجی باز میگرداند. این تابع مقدار NULL انتهای رشته را محاسبه نمی‌کند.

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

int main () {
   char str[50];
   int len;

   strcpy(str, "This is Digispark.ir");

   len = strlen(str);
   printf("Length of |%s| is |%d|\n", str, len);
   
   return(0);
}

خروجی کد بالا به صورت زیر است.

Length of |This is Digispark.ir| is |20|
  • char *strstr(char *str1, char *str2)

این تابع عملیات مقایسه رشته str2 را با رشته str1 را انجام می‌دهد. رشته str2 طول کمتری نسبت به رشته str1 دراد. به عبارت دیگر این تابع بررسی میکند که آیا مقداری که در رشته str2 قرار دارد، در رشته str1 نیز وجود دارد یا خیر. در صورتی که کاراکتر موجود در رشته str2 در str1 موجود باشد. این تابع یک اشاره گر به اولین وقوع str1 از کل دنباله کاراکتر های مشخص شده در str2 بر می‌گرداند. در غیر این صورت کاراکتر NULL را بر می‌گرداند.

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


int main () {
   char str1[20] = "Digispark";
   char str2[10] = "spark";
   char *ret;

   ret = strstr(str1, str2);

   printf("The substring is: %s\n", ret);
   
   return(0);
}

خروجی کد بالا به صورت زیر است.

The substring is: spark
  • int strcmp(const char *str1, const char *str2)

این تابع دو رشته str1 و str2 را برمبنای حروف الفبا با یک دیگر مقایسه می‌کند. در صورتی که رشته str1 از str2 بزرگ تر باشد عددی منفی و در صورتی که با یم دیگر برابر باشند عدد ۰ و در صورتی که رشته str2 از str1 بازرگ تر باشد عددی مثبت را در خروجی بر می‌گرداند.

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

int main () {
   char str1[15];
   char str2[15];
   int ret;


   strcpy(str1, "abcdef");
   strcpy(str2, "ABCDEF");

   ret = strcmp(str1, str2);

   if(ret < 0) {
      printf("str1 is less than str2");
   } else if(ret > 0) {
      printf("str2 is less than str1");
   } else {
      printf("str1 is equal to str2");
   }
   
   return(0);
}

خروجی کد بالا به صورت زیر است.

str2 is less than str1
  • void *memchr(void *str, unsigned char c, unsigned char n)

این تابع n بایت از بافر را برای بایت c جست و جو می‌کند و اگر آن را پیدا کرد، اشاره گری به آن بر می‌گرداند. و در غیر این  صورت اشاره گر NULL را بر می‌گرداند.

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

int main () {
   const char str[] = "www.Digispark.ir";
   const char ch = '.';
   char *ret;

   ret = memchr(str, ch, strlen(str));

   printf("String after |%c| is - |%s|\n", ch, ret);

   return(0);
}

خروجی کد بالا به صورت زیر است.

String after |.| is - |.Digispark.ir|
  • void *memcpy(void *dest, const void *src, unsigned char n)

این تابع یک بلوک n بایتی از رشته src را در رشته dest کپی می‌کند.

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

int main () {
   const char src[50] = "www.Digispark.ir";
   char dest[50];
   strcpy(dest,"Hi!!");
   printf("Before memcpy dest = %s\n", dest);
   memcpy(dest, src, strlen(src)+1);
   printf("After memcpy dest = %s\n", dest);
   
   return(0);
}

خروجی کد بالا به صورت زیر است.

Before memcpy dest = Hi!!
After memcpy dest = www.Digispark.ir

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

 


لوازم مورد نیاز


این کتابخانه نیاز به ماژول خاصی ندارد. همانطور که گفته شد تقریبا تمامی میکروکنترلر های موجود در بازار که با زبان C برنامه نویسی می‌شوند از این کتابخانه پشتیبانی می‌کنند. برای تهیه میکروکنترلر مود نظر خود می‌توانید از طریق لینک زیر اقدام کنید.

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

 


جمع بندی


در این آموزش تحلیل و بررسی توابع موجود در کتابخانه string.h که یکی از مهم ترین کتابخانه های زبان C و ++C به شمار می آید، پداختیم. همانطور که در ابتدای آموزش گفته شد این کتابخانه به برد و یا کامپایلر خاصی محدود نمی‌شود. و در تمامی کامپایلر و یا IDE هایی که مبتنی بر زبان های C و ++C باشند، مورد استفاه قرار میگیرد. در پروژه هایی که در آن نیاز به ارسال و دریافت رشته است این کتابخانه میتواند کار ما را بسیار آسان تر کند. برای مثال در پروژه کنترلر پیامکی با SIM800L زمانی که پیامکی برای ماژول ارسال می‌شود. ماژول رشته ی طولانی را از طریق پروتکل USART به سمت میکروکنترلر ارسال می‌کند. برای این که توانیم بررسی کنیم در متن پیام دستور فعال شده کدام خروجی قرار دارد از تابع strstr که در کتابخانه String.h قرار دارد، کمک گرفته ایم.

 

چنانچه در مراحل راه اندازی و انجام این پروژه با مشکل مواجه شدید، بدون هیچ نگرانی در انتهای همین پست، به صورت ثبت نظر سوالتان را مطرح کنید. من در سریع‌ترین زمان ممکن پاسخ رفع مشکل شما را خواهم داد. همچنین اگر ایرادی در کدها و یا مراحل اجرایی وجود دارند می‌توانید از همین طریق اطلاع رسانی کنید.

 

در پایان نظرات و پیشنهادات خود را با ما درمیان بگذارید و با اشتراک گذاری این آموزش در شبکه های اجتماعی , از وبسایت دیجی اسپارک حمایت کنید.

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

علی زاهدی

برنامه نویس و طراح سیستم های مبتنی بر میکروکنترلر

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

تبادل نظر و رفع عیب با ثبت دیدگاه

۱ دیدگاه

  • سلام مهندس وقت بخیر
    در مورد دستور memcpy چرا در مثالی که زده شده دستور strlen(src) به آن یک اضافه شده است ؟؟؟؟
    در این خط memcpy(dest, src, strlen(src)+1);