راهنمای جامع کار با رشتهها در زبان C
مقدمه
در زبان C، رشتهها آرایههایی از کاراکترها هستند که با کاراکتر \0
یا همان (null terminator) خاتمه مییابند. برای کار با رشتهها، کتابخانه <string.h>
مجموعهای از توابع را ارائه میدهد که امکان مقایسه، کپی، جستجو و تغییر رشتهها را فراهم میکنند. برخی از این توابع رایج و شناختهشده هستند که در این آموزش توضیح داده شده اند، اما توابع کمتر شناختهشده نیز وجود دارند که میتوانند در برخی شرایط بسیار مفید باشند.

توابع رایج کار با رشتهها
1. strlen
– محاسبه طول رشته
این تابع طول یک رشته را بدون احتساب کاراکتر \0
محاسبه میکند.
1 2 3 4 5 6 7 8 | #include <stdio.h> #include <string.h> int main() { char str[] = "Hello, World!"; printf("Length: %lu\n", strlen(str)); return 0; } |
خروجی:
1 | Length: 13 |
2. strcpy
و strncpy
– کپی رشته
تابع strcpy
یک رشته را در مقصد کپی میکند، اما در صورت کوتاه بودن مقصد ممکن است باعث خرابی حافظه شود. strncpy
امنتر است زیرا تعداد کاراکترها را محدود میکند.
1 2 3 | char dest[20]; strcpy(dest, "Hello"); // نسخه ناامن strncpy(dest, "Hello", sizeof(dest) - 1); // امنتر |
خروجی:
1 | Copied: Hello |
3. strcmp
و strncmp
– مقایسه رشتهها
این توابع دو رشته را با هم مقایسه میکنند. strcmp
تمام کاراکترها را بررسی میکند، اما strncmp
فقط تعداد مشخصی از کاراکترها را مقایسه میکند.
1 2 3 | if (strcmp("hello", "Hello") == 0) { printf("Equal\n"); } |
خروجی:
1 | Not Equal |
توابع کمتر شناختهشده و کاربردی
4. strncasecmp
– مقایسه بدون حساسیت به حروف بزرگ و کوچک
1 2 3 4 5 6 7 8 9 | #include <stdio.h> #include <string.h> int main() { if (strncasecmp("Hello", "hello", 5) == 0) { printf("Strings are equal (case insensitive)\n"); } return 0; } |
خروجی:
1 | Strings are equal (case insensitive) |
5. strchrnul
– یافتن کاراکتر در رشته (بازگشت به پایان در صورت نبودن)
1 2 3 4 5 6 7 8 | #include <stdio.h> #include <string.h> int main() { char *ptr = strchrnul("Hello, World", 'x'); printf("Result: %c\n", *ptr); return 0; } |
خروجی:
1 | Result: \0 |
6. strdup
– تکثیر رشته (نیاز به <stdlib.h>
)
1 2 3 4 5 6 7 8 9 10 11 | #include <stdio.h> #include <stdlib.h> #include <string.h> int main() { char *original = "Hello"; char *copy = strdup(original); printf("Copy: %s\n", copy); free(copy); return 0; } |
خروجی:
1 | Copy: Hello |
7. strtok_r
– توکنایزر رشته (نسخه امنتر strtok
)
1 2 3 4 5 6 7 8 9 10 11 | #include <stdio.h> #include <string.h> int main() { char str[] = "one,two,three"; char *token, *rest = str; while ((token = strtok_r(rest, ",", &rest))) { printf("%s\n", token); } return 0; } |
خروجی:
1 2 3 | one two three |
8. memmem
– جستجوی رشته در یک بلاک حافظه
1 2 3 4 5 6 7 8 9 10 | #include <stdio.h> #include <string.h> int main() { char haystack[] = "Hello, this is a test"; char needle[] = "test"; char *result = memmem(haystack, strlen(haystack), needle, strlen(needle)); if (result) printf("Found: %s\n", result); return 0; } |
خروجی:
1 | Found: test |
9. strcasestr
– جستجوی زیررشته بدون حساسیت به حروف بزرگ و کوچک
1 2 3 4 5 6 7 8 9 10 | #include <stdio.h> #include <string.h> int main() { char *found = strcasestr("Hello World", "world"); if (found) { printf("Found: %s\n", found); } return 0; } |
خروجی:
1 | Found: World |
در زبان C توابع متعددی برای پردازش رشتهها وجود دارد. در این مقاله، علاوه بر توابع پرکاربرد، به توابع کمتر شناختهشدهای مانند strncasecmp
، strdup
، strchrnul
و strcasestr
اشاره شد که در برخی شرایط میتوانند جایگزین بهتری برای توابع استاندارد باشند. آشنایی با این توابع میتواند به بهینهتر و کاراتر شدن کدهای C شما کمک کند.