使用C的简单登录程序

时间:2018-05-08 08:39:30

标签: c

所以,我正在进行一项额外的实验室任务,要求我构建一个简单的登录程序,使用C读取studentID和密码。我试图使用strcmp()来验证ID和密码,但即使是比较的元素是正确的,程序将始终显示"错误的密码"。请帮我看看我的程序,任何帮助表示赞赏。提前致谢

以下是我的编码:

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

int main()
{
    char studentID[]="Clarance", password[]="123456", id[8], p[6];
    int n=1, x, y;

    do{
         printf("\nStudent_ID:");
         scanf("%s", &id);

         printf("\nPassword:");
         scanf("%s", &p);

         x=strcmp(id, studentID);
         y=strcmp(p, password);

         if(x==0 && y==0){
           printf("\nSucessfully Logged In");
         }else {
           printf("\nWrong Password, try again", 5-n);
            getch();
            n++;}

         if(n>5){
          printf("\nAccess Denied");
          getch();
          }

       }while (n<=5);

}

4 个答案:

答案 0 :(得分:0)

问题是如何你声明了常量字符串。

这就是我运行程序的原因:

...
char studentID[]="Clarance", password[]="123456";
...

ID stored: ''
ID read: 'Clarance'
Password stored: ''
Password read: '123456'
Wrong Password, try again

这就是我通过更改字符串声明得到的结果:

...
static const char studentID[]="Clarance", password[]="123456";
...
ID stored: 'Clarance'
ID read: 'Clarance'
Password stored: '123456'
Password read: '123456'
Sucessfully Logged In

以下是完整代码:

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

int main()
{
    static const char studentID[]="Clarance", password[]="123456";
    char id[8], p[6];
    int n=1, x, y;

    printf("%lu %lu:", strlen(id), strlen(studentID));


    do{
        printf("\nStudent_ID:");
        scanf("%s", &id);
        fflush(stdout);

        printf("\nPassword:");
        scanf("%s", &p);
        fflush(stdout);

        x=strcmp(id, studentID);
        y=strcmp(p, password);

        if(x==0 && y==0){
            printf("\nSucessfully Logged In");
        }else {
            printf("\nWrong Password, try again", 5-n);
            getchar();
            n++;}

        if(n>5){
            printf("\nAccess Denied");
            getchar();
        }

    }while (n<=5);

}

问题是您错过了flush(stdio);

每当使用scanf时,最好清理标准输入读缓冲区。 x函数允许这样做。

关于开发的说明

rm myprog; gcc -o myprog main.c; ./myprog
rm: myprog: No such file or directory
main.c:16:21: warning: format specifies type 'char *' but the argument has type 'char (*)[8]' [-Wformat]
        scanf("%s", &id);
               ~~   ^~~
main.c:20:21: warning: format specifies type 'char *' but the argument has type 'char (*)[6]' [-Wformat]
        scanf("%s", &p);
               ~~   ^~
main.c:34:51: warning: data argument not used by format string [-Wformat-extra-args]
            printf("\nWrong Password, try again", 5-n);
                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  ^
3 warnings generated.

学习使用调试器。 gcc命令提供了一个非常简单的方法。看看我的输出。从这一点可以看出,你的程序很有效,但它并不完美,因为有三个警告。稍微研究一下,试着冷静地理解它们的意思,并试着弄清楚如何解决它们。

调试器在软件开发过程中非常重要。

有关常量字符串的说明

请记住,变量或对象(如用户名和密码)通常来自数据库,但如果您的程序很简单且具有教育目的,那么修复这些变量以便它们不能在程序执行期间更改。换句话说,将只读属性分配给用户名和密码变量。在我发布的代码中,我进行了这些更改。

答案 1 :(得分:0)

这是我自己的解决方案版本。我知道它很简单但有效

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

int main()
{
    char studentID[]="Clarance", password[]="123456", id[20], p[20];
    int n=1, x, y;

    do{
         printf("\nStudent_ID:");
         scanf("%s", &id);
         fflush(stdout);

         printf("\nPassword:");
         scanf("%s", &p);
         fflush(stdout);

         x=strcmp(id, studentID);
         y=strcmp(p, password);

         if(x==0 && y==0){
           printf("\nSucessfully Logged In");
           break;
         }else {
           printf("\nWrong Password, try again", 5-n);
            getch();
            n++;}

         if(n>5){
          printf("\nAccess Denied");
          getch();
          }

       }while (n<=5);

}

答案 2 :(得分:0)

p []和id []的数组大小与字符串长度相同。实际上我们需要提供(length + 1)数组大小。这是考虑到最后的Null字符。 strcmp比较两个字符串直到空字符。

所以下面将是声明的数组。 char p [7],id [9];

如果您不想增加数组大小,请尝试使用strncmp(),其中可以提供第三个参数来指定要比较的字符总数。

答案 3 :(得分:-1)

#include <stdio.h>

int main(){
    char LoginId[100];
    char Password[100];

    while(1){
    printf("Welcome to the Login_System\n");
    printf("Please Enter your LoginID\n");
    gets(LoginId);
    printf("Please Enter your Password\n");
    gets(Password);
    if(strcmp(LoginId,"User")==0){
        if(strcmp(Password,"12345")==0){
            printf("Hey,You are Welcome\n");
            break;
        }
    }
    else{
        printf("Try Again!!\n");
    }
    }
    return 0;
}