الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

طلب تصحيح كود : إدخال كلمة السر من المستخدم

بدأه just a mystery في 30 يوليو 2012 · 28 رد · 2,126 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم عندى كود لكلمة سر بس يعطى اخطاء وحقيقي ما عرفت كيف اصلحه يا ريت تفيدونى

هذا هو الكود

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

main()
{
    char *pass = "nono";
    char p;
    char *pass1;
    int i = 0;
    while (i < 5)
        cin >> p;
    if (p != '/b')
    {
        cout << "*";
        i++;
    }
    else
    {
        i--;
    }
    if (p == '/r')
    {
        pass1 = &p;
        if (strcmp(*pass1, *pass) != 0);
        cout << "yup";
        else
            cout << "no";
    }
    else
        cout << "nahi";
    return 0;
}

يا ريت لمساعدة فى اقرب اقرب اقرب وقت

شكرا

تم تعديل هذه المشاركة بواسطة أحمد الشنقيطي في 1 أغسطس 2012 في 11:27 — السبب: تعديل العنوان.

#2

السلام عليكم

اقتباس
يا ريت لمساعدة فى اقرب اقرب اقرب وقت

ألا تكفي أقرب مرة واحدة ؟ :D

بصراحة, تتبع الأكواد أصعب عندي من كتابة كود من جديد بسبب الكسل :)

لذا كتبتُ لك كود بسيط يطلب من المستخدم إدخال كلمة مرور دون أن يُظهر حروفها على الشاشة ثم يتأكد من صحتها, انظر :

#include<iostream>
#include<cstring>
#include<conio.h>
using namespace std;

#define PASSWORD "ArabTeam"

void readPassword(char* str) {
    while (*str = getch()) {
        if (*str == '\r') {
            *str = '\0';
            break;
        } else {
            cout<<'*';
            str++;
        }
    }
    *str = '\0';
}

int main() {
    char *pass;
    cout<<"Tapez le mot de passe : ";
    readPassword(pass);
    if (strcmp(pass, PASSWORD) == 0)
        cout<<endl<<"Merci le mot de passe est correct :)";
    else
        cout<<endl<<"\aErreur! le mot de passe est incorrect :(";
    return 0;
}

كلمة المرور الحالية هي ArabTeam, يمكنك تغييرها كيفما تشاء باستخدام الماكرو PASSWORD.

أرجو لك التوفيق.

2
#3

ربما اللجوء لدوال النظام خيار جيّد :

#include<windows.h>
#include<shellapi.h>
#include<stdio.h>

int main(int argc, char **argv) {

    char password[256];
    HANDLE hConsoleHandle;
    DWORD lpMode;

    hConsoleHandle = GetStdHandle(STD_INPUT_HANDLE);
    GetConsoleMode(hConsoleHandle, &lpMode);

    lpMode  &= ~ENABLE_ECHO_INPUT;
    SetConsoleMode(hConsoleHandle, lpMode);

    printf("Password: ");
    scanf("%255s", password);  
    printf("\nYour password is '%s'\n", password);

    lpMode  |= ENABLE_ECHO_INPUT;
    SetConsoleMode(hConsoleHandle, lpMode);

    return(0);
}

إخذنا مقبض للجهاز الخاص بقراءة مدخلات المستخدم ,STD_INPUT_HANDLE, عن طريق الدالة GetStdHandle. ثم قراءنا إعدادات سطر الأوامر التي وضعها النظام بإسخدام GetConsoleMode. من بين تلك الإعدادات خاصية flag إسمها ENABLE_ECHO_INPUT (رقم ثابت يساوي 4) وهي المسؤولة عن جعل سطر الأوامر يطبع مايكتبه المسخدم. لذا سنحذف البتات الخاصة بتلك الخاصية عن طريق هذه العملية المنطقية :

lpMode  &= ~ENABLE_ECHO_INPUT

ثٌم نشّطنا الوضع الجديد لسطر الأوامر بإستخدام الدالة SetConsoleMode. الآن عند قراءة مايكتبه المستخدم لن يظهر مايكتبه. بعد قراءة ماكتبه المستخدم يمكن إعادة الأمور لما كانت عليها عن طريق عكس تلك العملية ووصل البتات الخاصة بـENABLE_ECHO_INPUT من جديد :

lpMode  |=  ENABLE_ECHO_INPUT

وستعود كما هي عليه .

الشغله بسيطة فعلياً لكن ربما العمليتين المنطقيتين تلك تسبب ربكة إذا كنت تتعامل لأول مرة معها. إذا كان كذلك, رجاءً إنظر لهذا المثال ومخرجاته وإعبث به قليلاً, متأكد أنك ستفهم :

#include<stdio.h>

typedef enum _MY_MODE {
    MODE_READ       = 1,   /* 2^0 = 1 OR 1 << 0 , in binary 001*/
    MODE_WRITE      = 2,   /* 2^1 = 2 OR 1 << 1 , in binary 010*/
    MODE_EXECUTE    = 4,   /* 2^2 = 4 OR 1 << 2 , in binary 100 */
} MY_MODE;

void read_mode(unsigned int mode);

int main(int argc, char **argv) {

    unsigned int mode;

    /* Join MODE_WRITE */
    mode    = MODE_READ;
    read_mode(mode);
    printf("--------------------------\n");

    /* Join 'MODE_WRITE' and 'MODE_WRITE' */
    mode    = MODE_READ | MODE_WRITE;
    read_mode(mode);
    printf("--------------------------\n");

    /* Join 'MODE_WRITE' and 'MODE_WRITE' and 'MODE_EXECUTE' */
    mode    = MODE_READ | MODE_WRITE | MODE_EXECUTE;
    read_mode(mode);
    printf("--------------------------\n");

    /* Remove 'MODE_WRITE' */
    mode   &= ~MODE_WRITE;
    read_mode(mode);
    printf("--------------------------\n");

    /* Join 'MODE_WRITE' */
    mode   |= MODE_WRITE;
    read_mode(mode);
    printf("--------------------------\n");

    return(0);
}

void read_mode(unsigned int mode) {

    /* If mode & MODE_XXX != 0, then MODE_XXX must be passed */

    if((mode & MODE_READ) != 0)
        printf("MODE_READ is passed.\n");

    if((mode & MODE_WRITE) != 0)
        printf("MODE_WRITE is passed.\n");

    if((mode & MODE_EXECUTE) != 0)
        printf("MODE_EXECUTE is passed.\n");

}

> a.exeMODE_READ is active.
--------------------------
MODE_READ is active.
MODE_WRITE is active.
--------------------------
MODE_READ is active.
MODE_WRITE is active.
MODE_EXECUTE is active.
--------------------------
MODE_READ is active.
MODE_EXECUTE is active.
--------------------------
MODE_READ is active.
MODE_WRITE is active.
MODE_EXECUTE is active.
--------------------------
>

تم تعديل هذه المشاركة بواسطة Mr.B في 31 يوليو 2012 في 02:10

#4

الأخ الكريم/الأخت الكريمة

السلام عليكم ورحمة الله وبركاته

مرحباً بكم في منتدى الفريق العربي للبرمجة

نود تنبيهك أن العنوان غير مناسب.

الرجاء اختيار عنوان مناسب أكثر في مواضيعك القادمة، وهذا بمثابة إشعار للأهمية.

وفي حال التكرار سيتعرض موضوعك للإغلاق والحذف!!!

قواعد المشاركة

/index.php?showtopic=29343

شاكرين لكم حُسن تعاونكم

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#5
أحمد الشنقيطي كتب:

السلام عليكم

ألا تكفي أقرب مرة واحدة ؟ :D

بصراحة, تتبع الأكواد أصعب عندي من كتابة كود من جديد بسبب الكسل :)

لذا كتبتُ لك كود بسيط يطلب من المستخدم إدخال كلمة مرور دون أن يُظهر حروفها على الشاشة ثم يتأكد من صحتها, انظر :

#include<iostream>
#include<cstring>
#include<conio.h>
using namespace std;

#define PASSWORD "ArabTeam"

void readPassword(char* str) {
    while (*str = getch()) {
        if (*str == '\r') {
            *str = '\0';
            break;
        } else {
            cout<<'*';
            str++;
        }
    }
    *str = '\0';
}

int main() {
    char *pass;
    cout<<"Tapez le mot de passe : ";
    readPassword(pass);
    if (strcmp(pass, PASSWORD) == 0)
        cout<<endl<<"Merci le mot de passe est correct :)";
    else
        cout<<endl<<"\aErreur! le mot de passe est incorrect :(";
    return 0;
}

كلمة المرور الحالية هي ArabTeam, يمكنك تغييرها كيفما تشاء باستخدام الماكرو PASSWORD.

أرجو لك التوفيق.

مشكور اخى بس يا ريت تشرحى البرنامج حاولت انفذه بس اول ما اضغط على اى حرف البرنامج يعلق وما يتنفذ ... جزاك الله خيرا :)

تم تعديل هذه المشاركة بواسطة just a mystery في 31 يوليو 2012 في 19:02

#6

MR.B...جزاك الله خيرا وجارى المحاولة

Xacker.... تمت القراءة وان شا الله ننفذ ...جزاك الله خيرا

#7
اقتباس
حاولت انفذه بس اول ما اضغط على اى حرف البرنامج يعلق وما يتنفذ

ما اسم الــ IDE الذي تعمل عليه ؟

استخدم الدالة

getchar();

قبل نهاية البرنامج من أجل تثبيت الشاشة.

#8

عفوا اخى ما هو ال ide??

البرنامج قبل ما يحصل له crash يعطى لى رساله بخطا فى ها الجملة

while (*str = getch()) {

تم تعديل هذه المشاركة بواسطة just a mystery في 31 يوليو 2012 في 19:55

#9
اقتباس
عفوا اخى ما هو ال ide ؟

راجع الأسئلة الأكثر شيوعا.

اقتباس
البرنامج قبل ما يحصل له crash يعطى لى رساله بخطا فى ها الجملة

while (*str = getch()) {

الكود يعمل عندي بدون أي مشاكل, انظر:

post-219439-048034000 1343756055_thumb.p
المرفقات
Password.png
#10

اخى انا استخدم Visual studio المقدم من شركة Microsoft

#11
اقتباس
اخى انا استخدم Visual studio المقدم من شركة Microsoft

هل تظهر لك أخطاء عند الترجمة ؟

#12

نعم اخى تظهر معى اخطاء

اخى حتى عندما اريد تفادى الاخطاء اقوم بمسح جزؤ من الكود للجزء الذي يحتوى الاخطاء .. بعدها يكون مافى اخطاء تظهر عبارة ادخل كلمة السر عندما اضغط على اى زر يتوقف البرنامج عن العمل ويعطى اشارة فى المكان اللى حددته فى الرد السابق اى مكان عبارة while

#14

Compiling NONAME00.CPP:

Error NONAME00.CPP 1: Unable to open include file 'IOSTREAM'

Error NONAME00.CPP 4: Declaration syntax error

Error NONAME00.CPP 9: Call to undefined function 'getch' in function readPassword(char *)

Warning NONAME00.CPP 9: Possibly incorrect assignment in function readPassword(char *)

Error NONAME00.CPP 14: Undefined symbol 'cout' in function readPassword(char *)

Error NONAME00.CPP 23: Undefined symbol 'cout' in function main()

Warning NONAME00.CPP 24: Possible use of 'pass' before definition in function main()

Error NONAME00.CPP 25: Call to undefined function 'strcmp' in function main()

Error NONAME00.CPP 26: Undefined symbol 'endl' in function main()

#15

أي نسخة تستخدم من الــ VS ؟

جرب هذا و أخبرني:

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

#define PASSWORD "ArabTeam"

void readPassword(char* str) {
    while (*str = getch()) {
        if (*str == '\r') {
            *str = '\0';
            break;
        } else {
            cout<<'*';
            str++;
        }
    }
    *str = '\0';
}

int main() {
    char *pass;
    cout<<"Tapez le mot de passe : ";
    readPassword(pass);
    if (strcmp(pass, PASSWORD) == 0)
        cout<<endl<<"Merci le mot de passe est correct :)";
    else
        cout<<endl<<"\aErreur! le mot de passe est incorrect :(";
    return 0;
}
#16

بستخدم نسخة 2005 و2008

جربت البرنامج لا يوجد اخطاء لكن يحصل ليه crash اول ما اضغط اى رز

#17
اقتباس
جربت البرنامج لا يوجد اخطاء لكن يحصل ليه crash اول ما اضغط اى رز

الكود صحيح 100% (انظر هنا), المشكلة تكمن في البيئة التي تعمل أنت عليها :)

استخدم Code::Blocks أو نسخة أحدث من VS.

#18

من اين استطيع تحميل Code::Blocks؟؟؟

معليش بس ممكن تشرحلى ها الدالة

void readPassword(char* str) {
    while (*str = getch()) {
        if (*str == '\r') {
            *str = '\0';
            break;
        } else {
            cout<<'*';
            str++;
        }
    }
    *str = '\0';
}

وكيفية عملها ؟؟ جزاك الله خيرا :)

تم تعديل هذه المشاركة بواسطة أحمد الشنقيطي في 1 أغسطس 2012 في 00:10 — السبب: تنسيق الكود.

#19
اقتباس
من اين استطيع تحميل Code::Blocks ؟

من هنا !

اقتباس
ممكن تشرحلى ها الدالة

void readPassword(char* str) {
    while (*str = getch()) {
        if (*str == '\r') {
            *str = '\0';
            break;
        } else {
            cout<<'*';
            str++;
        }
    }
    *str = '\0';
}

وكيفية عملها ؟؟

تستقبل الدالة readPassword عنوان السلسلة الحرفية التي ستُخزن فيها كلمة المرور.

هذا الشرط :

*str = getch()

معناه : "ما دام المُستخدم يُدخل حرف", يكون الشرط غير محقق في حالة نادرة جدا .. إذا حدث خطأ في الإدخال أو في عمل الدالة getch.

الدالة getch تقرأ حرف من المستخدم دون أن تُظهره على الشاشة.

هذا الشرط:

*str == '\r'

معناه : "إذا كان الرمز المُدخل عبارة عن Enter", حينها نقوم بتخزين الرمز \0 بدل رمز الأنتر للدلالة على نهاية الجملة ثم نخرج من الحلقة عن طريق الأمر break.

في الحالة المعاكسة (إذا كان الحرف المُدخل يختلف عن أنتر) نقوم بإظهار نجمة ثم نقوم بزيادة المؤشر str بخطوة إلى الأمام لننتقل إلى الخانة الموالية.

عند الخروج من الحلقة نقوم بتخزين الرمز \0 للدلالة على نهاية السلسلة.

تم تعديل هذه المشاركة بواسطة أحمد الشنقيطي في 1 أغسطس 2012 في 00:10

#20

اخى احمد جزاك ربي الجنة ... طيب معليش كمان سؤال ..لتحميل Code::Blocks هل مطلوب امسح اللى معى فى الجهاز ؟؟

مشكور على الشرح :)

#21

أظن أنه يمكن أن يعملان معا, لأنني كنت أعمل على خمس IDE (من بينهم Visual C++ and Code::Blocks) بدون أي مشاكل :)

#22

تم تعديل العنوان.

نرجو منكم اختيار عنوان مناسب لمحتوى موضوعكم مستقبلا و شكرا.

#23
أحمد الشنقيطي كتب:

أي نسخة تستخدم من الــ VS ؟

جرب هذا و أخبرني:

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

#define PASSWORD "ArabTeam"

void readPassword(char* str) {
    while (*str = getch()) {
        if (*str == '\r') {
            *str = '\0';
            break;
        } else {
            cout<<'*';
            str++;
        }
    }
    *str = '\0';
}

int main() {
    char *pass;
    cout<<"Tapez le mot de passe : ";
    readPassword(pass);
    if (strcmp(pass, PASSWORD) == 0)
        cout<<endl<<"Merci le mot de passe est correct :)";
    else
        cout<<endl<<"\aErreur! le mot de passe est incorrect :(";
    return 0;
}

اخي هناك خطأ في هذا الكود انت تمرر مؤشر يؤشر الى لا شيئ فالدالة getch

اين تعيد الحرف , فstr لم يحصل على مكان في الذاكرة بعد لتكون الدالة main كالتالي

int main() {
	char p[256];
    char *pass = &p[0]; 
    cout<<"Tapez le mot de passe : ";
    readPassword(pass);
    if (strcmp(pass, PASSWORD) == 0)
        cout<<endl<<"Merci le mot de passe est correct :)";
    else
        cout<<endl<<"\aErreur! le mot de passe est incorrect :(";
	system("pause");
    return 0;
}

تم تعديل هذه المشاركة بواسطة nadir02 في 1 أغسطس 2012 في 14:57

#24

معك حق :)

just a mystery@

استخدم

char pass[256];

بدلا من

char *pass;
#25
أحمد الشنقيطي كتب:

السلام عليكم

ألا تكفي أقرب مرة واحدة ؟ :D

بصراحة, تتبع الأكواد أصعب عندي من كتابة كود من جديد بسبب الكسل :)

لذا كتبتُ لك كود بسيط يطلب من المستخدم إدخال كلمة مرور دون أن يُظهر حروفها على الشاشة ثم يتأكد من صحتها, انظر :

#include<iostream>
#include<cstring>
#include<conio.h>
using namespace std;

#define PASSWORD "ArabTeam"

void readPassword(char* str) {
    while (*str = getch()) {
        if (*str == '\r') {
            *str = '\0';
            break;
        } else {
            cout<<'*';
            str++;
        }
    }
    *str = '\0';
}

int main() {
    char *pass;
    cout<<"Tapez le mot de passe : ";
    readPassword(pass);
    if (strcmp(pass, PASSWORD) == 0)
        cout<<endl<<"Merci le mot de passe est correct :)";
    else
        cout<<endl<<"\aErreur! le mot de passe est incorrect :(";
    return 0;
}

كلمة المرور الحالية هي ArabTeam, يمكنك تغييرها كيفما تشاء باستخدام الماكرو PASSWORD.

أرجو لك التوفيق.

شكرا الك اخوي احمد ، لكن هناك شي صغير ... اذا نجرب حذف الباسورد ما يمشي الحال :dry:

:happy:

أحمد الشنقيطي كتب:

أظن أنه يمكن أن يعملان معا, لأنني كنت أعمل على خمس IDE (من بينهم Visual C++ and Code::Blocks) بدون أي مشاكل :)

ماهي الIDE الثلاثة المتبقية ؟؟

؟؟؟؟؟

Dev-C++

C++ Builder

؟؟؟؟؟

:happy:

556891961.gif

I am learning from you

it is the programmer eye

مواضيع مشابهة