آردوینو – رشته ها
رشته ها برای ذخیره متن استفاده می شوند. از آن ها می توان برای نمایش متن بر روی LCD یا در پنجره سریال مانیتور Arduino IDE Serial Monitor استفاده کرد. رشته ها برای ذخیره سازی ورودی کاربر نیز مفید هستند. ورودی کاربر مانند کاراکتر هایی است که کاربر در صفحه کلید متصل به آردوینو وارد می کند.
در برنامه نویسی آردوینو دو نوع رشته وجود دارد :
- آرایه های کاراکتری ، که همان رشته های مورد استفاده در برنامه نویسی C هستند.
- رشته آردوینو ، که به ما امکان می دهد از یک شیء رشته ای در یک طرح استفاده کنیم.
در این جلسه ، رشته ها ، اشیاء و استفاده از رشته ها را در طرح های آردوینو یاد خواهیم گرفت. در انتهای جلسه ، خواهیم آموخت که از کدام نوع رشته برای استفاده در یک طرح استفاده کنیم.
آرایه های رشته ای از نوع کاراکتر :
اولین رشته ای که ما یاد خواهیم گرفت رشته ای است که یک سری کاراکتر از نوع char است. در جلسه آرایه ها ، ما یاد گرفتیم که یک آرایه چیست. (یک سری متوالی از نوع متغیر ذخیره شده در حافظه.) رشته در این نوع ، مجموعه ای از متغیرهای char است.
رشته ، یک آرایه ویژه است که در انتهای آن یک عنصر اضافی وجود دارد و همواره دارای مقدار 0 (صفر) است. این نوع رشته به عنوان “رشته خاتمه یافته صفر” شناخته می شود.
مثال آرایه های رشته ای از نوع کاراکتر :
در این مثال نحوه ساخت رشته و نمایش آن در پنجره مانیتور سریال نشان داده شده است.
مثال :
void setup() { char my_str[6]; // an array big enough for a 5 character string Serial.begin(9600); my_str[0] = 'H'; // the string consists of 5 characters my_str[1] = 'e'; my_str[2] = 'l'; my_str[3] = 'l'; my_str[4] = 'o'; my_str[5] = 0; // 6th array element is a null terminator Serial.println(my_str); } void loop() { }
مثال زیر نشان می دهد که رشته ای از چه چیز هایی ساخته شده است. یک آرایه ی کاراکتری با کاراکتر های قابل نمایش و “صفر” به عنوان آخرین عنصر آرایه برای نشان دادن این است که در اینجا رشته خاتمه یافته است. این رشته را می توان با استفاده از دستور () Serial.println و نوشتن نام رشته داخل پرانتز ها در پنجره Arduino IDE Serial Monitor نمایش داد.
مثال بالا را می توان به روش راحت تری نوشت که در شکل زیر نشان داده شده است :
مثال :
void setup() { char my_str[] = "Hello"; Serial.begin(9600); Serial.println(my_str); } void loop() { }
در این طرح ، کامپایلر اندازه آرایه رشته را محاسبه می کند و همچنین بطور خودکار انتهای رشته را با صفر خاتمه می دهد. آرایه ای که شش عنصر دارد و از پنج کاراکتر تشکیل شده است و یک صفر (دقیقاً به همان شکلی که در طرح قبلی ایجاد شده بود) به انتهای آن اضافه می شود.
تغییر آرایه های رشته ای :
ما می توانیم یک آرایه ی رشته ای را در یک طرح تغییر دهیم :
مثال :
void setup() { char like[] = "I like coffee and cake"; // create a string Serial.begin(9600); // (1) print the string Serial.println(like); // (2) delete part of the string like[13] = 0; Serial.println(like); // (3) substitute a word into the string like[13] = ' '; // replace the null terminator with a space like[18] = 't'; // insert the new word like[19] = 'e'; like[20] = 'a'; like[21] = 0; // terminate the string Serial.println(like); } void loop() { }
نتایج :
I like coffee and cake I like coffee I like coffee and tea
مثال بالا به روش زیر کار می کند :
ایجاد و نمایش رشته :
در مثال ارائه شده در بالا ، یک رشته جدید ایجاد می شود و سپس در پنجره Serial Monitor نمایش داده می شود.
کوتاه کردن رشته :
رشته با جایگزین کردن کاراکتر چهاردهم در رشته ای با صفر خاتمه (2) کوتاه می شود. این عنصر شماره 13 در آرایه ی رشته ای است که از 0 محاسبه می شود.
وقتی رشته نمایش داده می شود ، تمام کاراکتر ها تا صفر خاتمه جدید نمایش داده می شوند و بقیه ی کارکتر ها از بین نمی روند؛ آنها هنوز هم در حافظه وجود دارند و اندازه آرایه رشته ای هنوز تغییری نکرده است. تنها تفاوت این است که هر تابعی که با رشته ها کار کند ، فقط رشته را با اولین پایان دهنده صفر خواهد دید.
تغییر یک کلمه در رشته :
سرانجام در طرح ، کلمه “cake” با “tea” جایگزین می شود (3). ابتدا می بایست صفر خاتمه را مانند [13] با فضایی جایگزین کرد تا رشته به قالب اولیه ایجاد شده بازگردد.
کاراکتر های جدید ، قسمت “cak” از کلمه ی “cake” را با کلمه ی “tea” بازنویسی می کنند. این کار با نوشتن تک کاراکترها انجام می شود. حرف “e” در “cake” با یک کاراکتر خاتمه دهنده ی جدید جایگزین می شود. نتیجه این است که رشته در واقع با دو کاراکتر صفر خاتمه می یابد ، صفر خاتمه دهنده اصلی (پایان دهنده تعیین کننده) در انتهای رشته قرار می گیرد و صفر خاتمه دهنده ی جدید که جایگزین “e” در “cake” می شود. این امر هنگام نمایش رشته جدید فرقی نمی کند زیرا تابعی که رشته را نمایش می دهند هنگام مواجهه با اولین پایان دهنده صفر ، نمایش کاراکتر های رشته را متوقف می کند.
توابع برای تغییر آرایه های رشته ای :
مثال قبلی با دستیابی به تک کاراکترها در رشته ، رشته را به صورت دستی تغییر می دهد. برای آسان تر کردن تغییر آرایه های رشته ای ، شما می توانید تابع ای را برای این عمل بنویسید ، یا از برخی توابع رشته ای موجود در کتابخانه ی زبان C استفاده کنید.
در زیر لیست توابعِ تغییر آرایه های رشته ای آورده شده است.
مثال بعدی از برخی توابع رشته ای در زبان C استفاده می کند.
مثال :
void setup() { char str[] = "This is my string"; // create a string char out_str[40]; // output from string functions placed here int num; // general purpose integer Serial.begin(9600); // (1) print the string Serial.println(str); // (2) get the length of the string (excludes null terminator) num = strlen(str); Serial.print("String length is: "); Serial.println(num); // (3) get the length of the array (includes null terminator) num = sizeof(str); // sizeof() is not a C string function Serial.print("Size of the array: "); Serial.println(num); // (4) copy a string strcpy(out_str, str); Serial.println(out_str); // (5) add a string to the end of a string (append) strcat(out_str, " sketch."); Serial.println(out_str); num = strlen(out_str); Serial.print("String length is: "); Serial.println(num); num = sizeof(out_str); Serial.print("Size of the array out_str[]: "); Serial.println(num); } void loop() { }
نتایج :
This is my string String length is: 17 Size of the array: 18 This is my string This is my string sketch. String length is: 25 Size of the array out_str[]: 40
مثال بالا به روش زیر کار می کند :
ایجاد و نمایش رشته :
رشته جدید ایجاد شده همانطور که در مثال های قبلی انجام می شد ، روی پنجره Serial Monitor نمایش داده می شود.
طول رشته را به دست آورید :
از تابع () strlen برای به دست آوردن طول رشته استفاده می شود. طول رشته فقط برای کاراکتر های قابل نمایش مورد استفاده است و شامل صفر پایان دهنده نیست.
این رشته شامل 17 کاراکتر است ، بنابراین 17 کاراکتر نمایش داده شده را در پنجره Serial Monitor می بینیم.
طول آرایه را اندازه بگیرید :
عملگر () sizeof برای به دست آوردن طول آرایه ای که شامل رشته است ، استفاده می شود. طول آرایه شامل صفر پایان دهنده است ، بنابراین طول آرایه یک واحد بیشتر از طول رشته است.
دستور () sizeof مانند یک تابع است ، اما از نظر فنی یک عملگر است. این بخشی از کتابخانه ی رشته ی C نیست ، اما در مثال مورد استفاده قرار گرفت تا تفاوت بین طول آرایه و طول رشته (یا اندازه رشته) را نشان دهد.
رشته را کپی کنید :
از تابع () strcpy برای کپی کردن رشته [] str به آرایه [] out_num استفاده می شود. تابع () strcpy ، دومین رشته ای را که به آن تابع منتقل می شود در اولین رشته ، کپی می کند . پس از این کار یک کپی از رشته در آرایه [] out_num وجود دارد ، اما فقط 18 عنصر از آرایه را در بر می گیرد ، بنابراین ما هنوز 22 عنصر آزاد در آرایه داریم. این عنصر های آزاد بعد از رشته و در حافظه یافت می شوند.
این رشته به آرایه کپی شده تا در این آرایه فضای اضافی برای استفاده در ادامه ی این مثال را داشته باشیم. ادامه مثال اضافه کردن یک رشته به انتهای یک رشته دیگر است.
رشته را به یک رشته دیگر اضافه کنید (پیوسته) :
ادامه ی مثال ، اضافه کردن یک رشته به رشته دیگر است. این کار با استفاده از تابع () strcat انجام می شود. تابع () strcat رشته دوم را که به آن منتقل شده است ، بر روی انتهای رشته اول منتقل شده قرار می دهد.
بعد از اضافه کردن ، طول رشته نوشته می شود تا طول رشته جدید را نشان بدهد. سپس طول آرایه نوشته می شود تا نشان دهد که ما یک رشته 25 کاراکتری را در یک آرایه 40 عنصر داریم.
توجه داشته باشید که رشته های 25 کاراکتری به خاطر صفر خاتمه ، 26 کاراکتر آرایه را در خود جای می دهند.
مرزهای آرایه (باند های آرایه یا Array Bounds) :
هنگام کار با رشته ها و آرایه ها ، نکته ی مهم کار کردن در مرز رشته ها یا آرایه ها است. در مثال نمونه ، یک آرایه ایجاد شده است که 40 عنصر طول دارد ( به منظور اختصاص حافظه ای که می تواند برای تغییر رشته ها استفاده شود.)
اگر آرایه خیلی کوچک باشد و سعی کنیم رشته ای را که از آرایه آن بزرگتر است کپی کنیم ، در این صورت رشته در انتهای آرایه کپی می شود. حافظه ی عمومی ای که در انتهای آرایه وجود دارد می تواند شامل داده های مهم دیگری در طرح باشد که در این صورت می تواند روی رشته ما کپی شود. اگر حافظه ی عمومیِ انتهای رشته غلبه کند ، می تواند طرح را خراب کند یا باعث اتفاق غیر منتظره ای شود.