登录脚本不会按预期比较字符串输入

时间:2015-12-26 15:15:33

标签: c string string-comparison strcmp

所以我想创建一个登录脚本并且我编写了它但是当我运行它时,它总是说"错误的用户名"即使它是对的。

这是我的代码

#include <stdio.h>
#include <stdlib.h>
#define MYNAME "SLITHER"  //Defines SLITHER so u can put %s yo use it
#define HackerNum 1338
/*
Welcome To slithers Program
I will be coding what ever I like
c:
*/


void LoginScript ();

char RealUsername[20] = "slither";
char UsersInput[30];

int main ()
{
    printf("Welcome To /bin V1");
    printf("\n Made By slither!\n");

    LoginScript ();
}

void LoginScript ()
{
    printf("Please Login\n");
    printf("Username: ");
    scanf("%s",&UsersInput);
    //printf("You Entered %s", UsersInput); This says what you printed
    if (UsersInput == RealUsername)
    {
        printf("Logged in");
    }
    else
    {
        printf("Wrong Username");
    }
}

3 个答案:

答案 0 :(得分:7)

  • scanf("%s",&UsersInput);由于类型不匹配而导致未定义的行为(char*预期,获得char (*)[30]
  • UsersInput == RealUsername是指针的比较,而不是字符串的内容。 strcmp()可用于比较字符串。

在代码的开头添加#include <string.h>并尝试:

void LoginScript ()
{
    printf("Please Login\n");
    printf("Username: ");
    scanf("%29s",UsersInput); // add 29 (maximum length to read) to avoid buffer overrun
    //printf("You Entered %s", UsersInput); This says what you printed
    if (strcmp(UsersInput, RealUsername) == 0)
    {
        printf("Logged in");
    }
    else
    {
        printf("Wrong Username");
    }
}

答案 1 :(得分:3)

  

它总是说&#34;错误的用户名&#34;即使它是对的。

是的, 应该。在您的代码中,

  if (UsersInput == RealUsername)

错了。那是你应该如何比较字符串。这个陈述实际上试图比较指针本身,而不是&#34;字符串&#34;他们包含。这就是为什么,您的if支票无效,因为他们打算

您需要使用strcmp()string.h中的原型),例如

if ( !strcmp(UsersInput, RealUsername) )
{
    printf("Logged in\n");
}
else
{
    printf("Wrong Username\n");
}

话虽如此,

  1. int main ()int main (void)符合标准。
  2. scanf("%s",&UsersInput);最好是scanf("%29s",UsersInput);,以避免更长的输入可能导致缓冲区溢出。
  3. 在定义时初始化数组时,最好将大小分配留给编译器,例如,

    char RealUsername[ ] = "slither";
    

    被认为比

    更好
    char RealUsername[20] = "slither";
    

    有时,它会省去忘记终止空字符大小的计数。

答案 2 :(得分:1)

包括@sourav在内的许多其他人已经给出了使用strcmp的解决方案。

我想指出为什么它总是给出“错误的用户名”作为输出。

原因在于比较陈述本身。

if (UsersInput== RealUsername )
    {
        printf("Logged in");
    }

我们不是在这里比较字符串,而是在比较他们的地址。他们的地址总是不同。因此,结果总是“用户名错误”