سؤال

أحاول مقارنة سلوتين. واحد مخزن في ملف، والآخر استرجاع من المستخدم (Stdin).

إليك برنامج نموذجي:

int main()
{
    char targetName[50];
    fgets(targetName,50,stdin);

    char aName[] = "bob";
    printf("%d",strcmp(aName,targetName));

    return 0;
}

في هذا البرنامج، strcmp إرجاع قيمة -1 عندما يكون الإدخال "bob". وبعد لماذا هذا؟ اعتقدت أنهم يجب أن يكونوا متساوين. كيف يمكنني الحصول عليها بحيث تكون؟

هل كانت مفيدة؟

المحلول

strcmp هي واحدة من الوظائف القليلة التي لها نتائج عكسية للصواب والخطأ ... إذا كانت السلاسل متساوية، فإن النتيجة هي 0، وليس 1 كما تظن ....

if (strcmp(a, b)) {
    /* Do something here as the strings are not equal */
} else {
    /* Strings are equal */
}

بالحديث عن fgets, ، هناك احتمال أن هناك خط جديد مرتبط بنهاية السلسلة ... تحتاج إلى التخلص منه ...

+-+-+-+--+--+
|b|o|b|\n|\0|
+-+-+-+--+--+

للتخلص من نيولين تفعل هذا. تحذيرات: لا تستخدم "Strlen (Aname) - 1"، لأن الخط الذي تم إرجاعه بواسطة FGENTS قد يبدأ بحرف NUL - وبالتالي يصبح الفهرس في المخزن المؤقت -1:

aName[strcspn(aName, "\n")] = '\0';

+-+-+-+--+
|b|o|b|\0|
+-+-+-+--+

حاليا، strcmp يجب إرجاع 0 ...

نصائح أخرى

fgets يقرأ حتى يرى خط جديد ثم إرجاع، لذلك عند كتابة بوب، في وحدة التحكم، targetName يحتوي على "Bob n" الذي لا يتطابق مع "BOB". من FGETS Documenation: (Bolding المضافة)

يقرأ الأحرف من تيار وتخزينها كسلسلة C إلى STR حتى (Num-1) تم قراءة الأحرف أو إما جديد أو يتم الوصول إلى نهاية الملف، أيهما يأتي أولا. يحقق حرف Newline fgets عن القراءة، ولكنه يعتبر حرفا صالحا، وبالتالي يتم تضمينه في السلسلة التي تم نسخها إلى Str.يتم إلحاق حرف Null تلقائيا تلقائيا في Str بعد قراءة الأحرف للإشارة إلى نهاية سلسلة C.

تحتاج إلى إزالة الخط الجديد من نهاية الهدف قبل المقارنة.

int cch = strlen(targetName);
if (cch > 1 && targetName[cch-1] == '\n')
   targetName[cch-1] = '\0';

أو أضف NewLine إلى سلسلة الاختبار الخاصة بك.

char targetName[50];
fgets(targetName,50,stdin);

char aName[] = "bob\n";
printf("%d",strcmp(aName,targetName));

fpets هو إلحاق \n إلى السلسلة التي تقوم بسحبها من المستخدم عند الضغط على الإدخال. يمكنك الحصول على هذا باستخدام strcspn أو مجرد إضافة \n في نهاية السلسلة التي تحاول مقارنتها.

printf("Please enter put FILE_NAME (foo1, 2, or 3), ls, or exit: \n");
fgets(temp, 8, stdin);
temp[strcspn(temp, "\n")] = '\0';
if(strcmp(temp, "ls") == 0 || strcmp(temp, "exit") == 0)

هذا فقط يحل محل \n مع \0, ، ولكن إذا كنت تريد أن تكون كسول، فيمكنك القيام بذلك فقط:

printf("Please enter put FILE_NAME (foo1, 2, or 3), ls, or exit: \n");
fgets(temp, 8, stdin);
if(strcmp(temp, "ls\n") == 0 || strcmp(temp, "exit\n") == 0)

لكنها ليست أنيقة.

لأن FGENTS تضمين حرف جديد في المتغير targetName. وبعد هذا رمي قبالة المقارنة.

fgets إلحاق Newline إلى السلسلة، لذلك سوف ينتهي بك الأمر bob\n\0 وهو ليس هو نفسه bob\0.

في الغالب بسبب نهاية سحر Char في الإدخال " n" تحت نظام UNIX مثل النظام.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top