שימוש ב־strcmp()
חלק מהיחידה לוגיקה וזרימת תוכנית במסלול ה-C של Coddy. שיעור 18 מתוך 63.
למדת איך לחבר מחרוזות באמצעות strcat(), אבל מה אם צריך לקבוע אם שתי מחרוזות מכילות בדיוק את אותו טקסט? ב-C אי אפשר להשתמש באופרטור השוויון (==) כדי להשוות מחרוזות, כי הוא משווה רק כתובות זיכרון ולא את התוכן עצמו.
הפונקציה strcmp() מהספרייה <string.h> פותרת את הבעיה הזאת באמצעות השוואה בין שתי מחרוזות תו אחר תו. היא מבצעת את מה שנקרא השוואה לקסיקוגרפית — כלומר, משווה בין מחרוזות לפי סדר מילוני.
#include <stdio.h>
#include <string.h>
char word1[] = "apple";
char word2[] = "apple";
int result = strcmp(word1, word2); // מחזירה 0 (המחרוזות שוות)הפונקציה strcmp() מחזירה שלושה סוגי ערכים שונים: היא מחזירה 0 אם המחרוזות זהות, ערך שלילי אם המחרוזת הראשונה מופיעה לפני השנייה בסדר האלפביתי, וערך חיובי אם המחרוזת הראשונה מופיעה אחרי השנייה בסדר האלפביתי.
הפונקציה הזאת חיונית לקבלת החלטות על סמך תוכן של מחרוזות, למשל לאימות קלט של משתמשים, למיון נתוני טקסט או למימוש פונקציונליות חיפוש בתוכניות שלך.
אתגר
קלכתבו תוכנית C שמממשת מערכת פשוטה לאימות סיסמה באמצעות הפונקציה strcmp(). התוכנית צריכה:
- לקרוא מספר שלם
nשמייצג את מספר ניסיונות הכניסה שיש לעבד - עבור כל ניסיון כניסה:
- לקרוא שם משתמש מהקלט
- לקרוא סיסמה מהקלט
- להשתמש ב-
strcmp()כדי להשוות את שם המשתמש ל-"admin" - להשתמש ב-
strcmp()כדי להשוות את הסיסמה ל-"secret123" - להדפיס את ההודעה המתאימה על סמך תוצאות ההשוואה
- לאחר עיבוד כל הניסיונות, לספור ולהציג כמה כניסות מוצלחות התרחשו
לוגיקת אימות הכניסה צריכה להיות:
- אם גם שם המשתמש וגם הסיסמה נכונים: להדפיס "Login successful"
- אם שם המשתמש נכון אך הסיסמה שגויה: להדפיס "Invalid password"
- אם שם המשתמש שגוי אך הסיסמה נכונה: להדפיס "Invalid username"
- אם גם שם המשתמש וגם הסיסמה שגויים: להדפיס "Invalid credentials"
זכרו לכלול את הכותרת <string.h> כדי להשתמש בפונקציה strcmp().
הפלט שלכם צריך להציג את התוצאות בפורמט הבא:
[Login result message]
[Login result message]
...
Total successful logins: [count]לדוגמה, אם הקלט הוא:
4
admin
secret123
user
password
admin
wrong
guest
secret123הפלט שלכם צריך להיות:
Login successful
Invalid credentials
Invalid password
Invalid username
Total successful logins: 1האתגר הזה בודק את ההבנה שלכם בשימוש ב-strcmp() להשוואת מחרוזות לצורך בדיקת שוויון, במימוש לוגיקה מותנית על סמך תוצאות השוואת מחרוזות, ובספירת מופעים על סמך תוצאות ההשוואה.
נסו בעצמכם
#include <stdio.h>
#include <string.h>
int main() {
int n;
scanf("%d", &n);
char username[100];
char password[100];
int successful_logins = 0;
// TODO: כתבו כאן את הקוד שלכם
// עבדו כל ניסיון התחברות באמצעות הפונקציה strcmp()
// השוו את username ל-"admin" ואת password ל-"secret123"
// הדפיסו הודעות מתאימות וספרו את ההתחברויות המוצלחות
printf("Total successful logins: %d\n", successful_logins);
return 0;
}השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה לוגיקה וזרימת תוכנית
1יסודות המצביעים
מהו מצביע?הכרזה על מצביעיםאופרטור לקיחת הכתובת (&)אופרטור ביטול ההפניה (*)מצביעי NULLסיכום: יסודות המצביעים2מצביעים ומערכים
שמות מערכים כמצביעיםאיברי מערך ומצביעיםאריתמטיקה של מצביעיםהשוואת מצביעיםסיכום: מעבר על מערך באמצעות מצביעים5מצביעים ופונקציות
העברה לפי ערךהעברת מצביעים לפונקציותשינוי משתנים באמצעות מצביעיםדוגמה קלאסית: החלפההעברת מערכים לפונקציותחזרה: ארגומנטים של מצביעי פונקציה3מערכי תווים ומחרוזות
מחרוזות כמערכי charתו הסיום nullקלט מחרוזת באמצעות scanfשימוש ב־strlen()שימוש ב־strcpy()שימוש ב־strcat()שימוש ב־strcmp()סיכום: פונקציות מחרוזת בסיסיותתרגלו בעצמכם: קומפיילר C אונליין