עבור לתוכן

stringים בשפת סי

Featured Replies

פורסם

יש לי מטלה לבנות תוכנה שתבקש שם משתמש וסיסמא שאני יקבע ואם הם נכונים אז היא תעשה משו לא משנה כרגע.

עכשיו זה לא בעיה הבעיה נוצרת בזה שאת הסיסמא אני צריך שהיא תדפיס כ * (כוכבית)

כלומר ככה זה נראה אצלי בתוכנה:

enter user name

dima

enter pass

123

וככה זה אמור להיראות:

enter username

dima

enter pass

***

הבנתם?

אם לא תגידו אני יסביר שוב.

זה הקוד שלי:


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

void main()
{
char user[]="dima";
char user1[5];
char pass[]="123";
char pass1[50];
clrscr();

printf("Enter user name (maximum 5 sumbols):");
scanf("%s", user1);

if ( strlen(user1) > 5 )
{
printf("The user you entred is more than 5 symbols");
printf("\nPress any key to exit");
getch();
}

if ( strcmp(user,user1) == 0 )
{
printf("Enter password for %s:", user1);
scanf("%s", pass1);
if ( strcmp(pass, pass1) == 0 )
{
printf("Accept username and password.");
}
else
{
printf("Wrong password. Press any key to exit");
getch();
}
}
else
{
printf("Wrong username. Sorry. Press any key to exit");
getch();
}
}

פורסם

אתה רוצה עם אפשרות למחיקה?

אם לא זה נורא פשוט, אתה משתמש בGETCH, וכל פעם שזה שונה מ-\n אתה מדפיס כוכבית.


key=getch();
i=0;
while(key!='\n')
{
pass[i]=key;
i++;
printf("*");
key=getch();
}

פורסם
  • מחבר

לא עובד בלחיצה על אנטר הוא ממשיך להדפיס כוכביות שיניתי את זה ועכשיו זה אומר שכל סיסמא שאני מכניסה לא מתאימה

וכן אני רוצה גם אם מחיקה

שוב תודה

פורסם

ברור שזה לא מפסיק כשאתה לוחץ על אנטר, כי אתה צריך לוודא שהאסקי של המקש שנלחץ אינו האסקי של אנטר (או כל אות אחרת שתבחר). אם אני זוכר נכון ה-ASCII של ENTER הוא 13. אבל אני ממש לא בטוח... לגבי אפשרות מחיקה, אתה צריך להשתמש בפקודה כלשהי שעוברת למקום מסויים, XY, במסך ואני לא זוכר אותה כרגע...

פורסם
  • מחבר

ברור שזה לא מפסיק כשאתה לוחץ על אנטר, כי אתה צריך לוודא שהאסקי של המקש שנלחץ אינו האסקי של אנטר (או כל אות אחרת שתבחר). אם אני זוכר נכון ה-ASCII של ENTER הוא 13. אבל אני ממש לא בטוח... לגבי אפשרות מחיקה, אתה צריך להשתמש בפקודה כלשהי שעוברת למקום מסויים, XY, במסך ואני לא זוכר אותה כרגע...

את זה הבנתי ושיניתי

הבעיה היא שלא משנה אם אני מכניס קוד נכון או זה אומר wrong password

פורסם

זכרת לשים 0\ בסוף המחרוזת של הסיסמא אחרי שסיימת לקלוט אותה?

פורסם

חחח לא....

נראה לי שיש כזה דבר \b כמו \n רק שזה BACKSLASH תנסה לבדוק אם זה אכן קיים, ואיך משתמשים בזה(אני מאמין שפשוט מדפיסים את זה.

אם זה רק חוזר אחורה(כאילו יש INSERT) אז תדפיס רווח ושוב \b.

פורסם
  • מחבר

לא הבנתי כלום ???

פורסם

אתה בטוח שאתה יכול להשוות מחרוזות בגדלים שונים? כי הגדרת את pass  בגודל 50 תווים ואת pass1 בגודל 3 תווים... אם אני צודק, אז זה הבעייה... תנסה לשנות אתל הגודל של pass ל3 ותראה מה קורה

יש את הספר הזה שלמדתי ממנו תוך שבועיים C לרמה של 2 יח"ל...

http://www.hod-ami.co.il/product.asp?catalog%5Fname=hodami&category%5Fname=C&product%5Fid=59159&ParentCategory=Programming

פורסם
  • מחבר

טוב אני ינסה

פורסם

רק עכשיו שמתי לב... בקוד שלך יש בעיה חמורה של buffer overflow.

הגדרת את user1 בתור מערך של 5 תוים.

אם המשתמש הכניס יותר מ- 4 תוים, אתה עולה על הזיכרון של user ומשנה אותו. אם הוא מכניס משהו קצת יותר ארוך, אתה עולה גם על כתובת החזרה מ- main ויהיה לך segmentation fault במקרה הטוב.

פורסם
  • מחבר

כן אבל עשיתי בדיקה אם ה user1 יותר גדול מ 5 הוא מוציא שגיאה יוצא מה זה לא מספיק טוב?

פורסם

לא מספיק טוב אם אתה לא רוצה שהתוכנית תעוף לך (תנסה להכניס יותר מ- 10 תוים ותראה מה יקרה).

אגב, בדיוק בגלל זה, אם תוכנית כזאת היתה מגינה על משהו, כל האקר ממוצע היה יכול לפרוץ לשם (בלי קשר לזה שהטקסט של שם המשתמש והסיסמא נמצאים בקוד)

אתה יכול להגביל את מספר התוים ש- scanf תקרא ע"י

scanf("%4s", pass1);

פורסם
  • מחבר

טוב זאת תוכנה בסיסית אני לא בונה איזה משהוא מתוחכם בשביל חברה גדולה

אבל תודה שאתה אומר אני יתייחס לזה וישנה את הקוד

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

דיונים חדשים