0Pricing
C Academy · درس

strcmp والمقارنة

مقارنة السلاسل

strcmp والمقارنة درس مجاني في C Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C Academy 4 دروس في المجموع.

مقارنة السلاسل النصية

لا يمكنكم مقارنة السلاسل النصية باستخدام == في لغة C. فهذا يقارن فقط عناوين مصفوفتين، وليس محتوياتهما.

استخدموا strcmp(a, b) من <string.h> للمقارنة محرفاً بمحرف.

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

int main(void) {
    char a[] = "apple";
    char b[] = "apple";
    if (strcmp(a, b) == 0)
        printf("Strings are equal\n");
    return 0;
}

ما الذي تعيده strcmp

تعيد strcmp قيمة من النوع int:

  • 0 إذا كانت السلسلتان متساويتين
  • قيمة سالبة إذا كان أول محرف مختلف في a أصغر منه في b
  • قيمة موجبة خلاف ذلك
#include <stdio.h>
#include <string.h>

int main(void) {
    printf("%d\n", strcmp("abc", "abc"));
    printf("%d\n", strcmp("abc", "abd"));
    printf("%d\n", strcmp("abd", "abc"));
    return 0;
}

مغالطة الصفر يعني التساوي

من الأخطاء الشائعة كتابة if (strcmp(a, b)) توقّعاً أن تعني التساوي.

تذكّروا أن strcmp تعيد 0، وهي قيمة خاطئة منطقياً، عند التساوي؛ لذلك يكون الشرط صحيحاً عندما تختلف السلسلتان. قارنوا دائماً بالقيمة 0 صراحةً.

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

int main(void) {
    char input[] = "yes";
    if (strcmp(input, "yes") == 0)
        printf("Confirmed\n");
    else
        printf("Not confirmed\n");
    return 0;
}

كيفية عمل المقارنة

تقارن strcmp قيم ASCII (البايت) للمحارف واحداً تلو الآخر حتى تختلف أو يتم الوصول إلى مُنهٍ.

تأتي الأحرف الكبيرة (A=65) قبل الأحرف الصغيرة (a=97)، ولذلك تُرتّب "Zebra" قبل "apple".

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

int main(void) {
    printf("%d\n", strcmp("Zebra", "apple"));
    return 0;
}

الترتيب المعجمي

تتيح إشارة ناتج strcmp ترتيب السلاسل النصية أبجدياً. وتعني النتيجة السالبة أن الوسيط الأول يأتي قبل الوسيط الثاني في الترتيب المعجمي.

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

int main(void) {
    const char *x = "banana";
    const char *y = "cherry";
    if (strcmp(x, y) < 0)
        printf("%s comes before %s\n", x, y);
    return 0;
}

strncmp: مقارنة محدودة

تقارن strncmp(a, b, n) بحد أقصى n محارف. ويفيد ذلك في التحقق من البادئات.

فمثلاً، يمكنكم اختبار ما إذا كانت سلسلة نصية تبدأ بـ "http".

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

int main(void) {
    char url[] = "https://site.com";
    if (strncmp(url, "https", 5) == 0)
        printf("Secure URL\n");
    return 0;
}

مقارنة غير حساسة لحالة الأحرف

تراعي strcmp القياسية حالة الأحرف. ولتجاهل حالة الأحرف، يمكنكم تحويل المحارف باستخدام tolower من <ctype.h> أثناء المقارنة.

توفّر أنظمة POSIX أيضاً الدالة strcasecmp، لكنها ليست ضمن معيار C.

#include <stdio.h>
#include <ctype.h>

int ci_cmp(const char *a, const char *b) {
    while (*a && (tolower(*a) == tolower(*b))) { a++; b++; }
    return tolower(*a) - tolower(*b);
}

int main(void) {
    printf("%d\n", ci_cmp("Hello", "hello"));
    return 0;
}

البحث باستخدام المقارنة

يمكنكم التكرار على مصفوفة من السلاسل النصية واستخدام strcmp للعثور على تطابق، كما في جدول بحث بسيط.

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

int main(void) {
    const char *fruits[] = {"apple", "banana", "cherry"};
    const char *target = "banana";
    for (int i = 0; i < 3; i++) {
        if (strcmp(fruits[i], target) == 0) {
            printf("Found at index %d\n", i);
        }
    }
    return 0;
}

ترتيب السلاسل النصية

باستخدام strcmp أساساً للمقارنة، يمكنكم ترتيب مصفوفات السلاسل النصية. إليكم خوارزمية ترتيب فقاعي صغيرة تبدّل المؤشرات وفقاً للترتيب.

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

int main(void) {
    const char *names[] = {"Carol", "Alice", "Bob"};
    int n = 3;
    for (int i = 0; i < n - 1; i++)
        for (int j = 0; j < n - 1 - i; j++)
            if (strcmp(names[j], names[j+1]) > 0) {
                const char *t = names[j];
                names[j] = names[j+1];
                names[j+1] = t;
            }
    for (int i = 0; i < n; i++) printf("%s\n", names[i]);
    return 0;
}

لا تقارنوا بالطرح مباشرةً

قد تحاولون كتابة دالة المقارنة الخاصة بكم باستخدام a[i] - b[i]، لكن سلوك الإشارة لقيم char الخام محدد بالتنفيذ، وقد يحدث تجاوز للسعة.

فضّلوا مكتبة strcmp، فهي تتعامل مع هذه الحالات الحدّية بشكل صحيح.

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

int main(void) {
    int r = strcmp("file1", "file2");
    printf("Result sign: %s\n", r < 0 ? "negative" : "non-negative");
    return 0;
}

مقارنة إدخال المستخدم

من الاستخدامات العملية التحقق من كلمة مرور أو خيار في قائمة. اقرأوا الإدخال، ثم قارنوه بالقيم المتوقعة باستخدام strcmp.

قارنوا دائماً بالقيمة 0 للتحقق من التساوي.

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

int main(void) {
    char choice[] = "quit";
    if (strcmp(choice, "quit") == 0)
        printf("Exiting program\n");
    return 0;
}

تحقق سريع

اختبروا فهمكم للقيم التي تعيدها strcmp.

مراجعة

تعلّمتم كيفية مقارنة السلاسل النصية في لغة C:

  • تعيد strcmp القيمة 0 عند التساوي، وقيمة سالبة أو موجبة لتحديد الترتيب.
  • لا تستخدموا == مع السلاسل النصية؛ فهو يقارن العناوين.
  • اختبروا دائماً == 0 للتحقق من التساوي (مغالطة الصفر قيمة خاطئة منطقياً).
  • تقارن strncmp بادئة السلسلة؛ أما المقارنة غير الحساسة لحالة الأحرف فتحتاج إلى tolower.

الأسئلة الشائعة

هل درس «strcmp والمقارنة» مجاني؟

نعم — نص درس «strcmp والمقارنة» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C Academy 4 دروس في المجموع.

ماذا ستتعلم في «strcmp والمقارنة»؟

مقارنة السلاسل تتمرن على C Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ C Academy؟

لا تُشترط خبرة سابقة. C Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.

كم من الوقت يستغرق درس «strcmp والمقارنة»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس C Academy هذا؟

نعم. كل درس في C Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. strlen وstrcpy وstrcat
  2. strcmp والمقارنة
  3. strtok وتقسيم الرموز
  4. memcpy وmemset
← العودة إلى C Academy