strcmp على خط قراءة مع fts
سؤال
أحاول مقارنة سلوتين. واحد مخزن في ملف، والآخر استرجاع من المستخدم (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 مثل النظام.