首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >登录脚本未按预期比较字符串输入

登录脚本未按预期比较字符串输入
EN

Stack Overflow用户
提问于 2015-12-26 23:15:33
回答 3查看 35关注 0票数 3

所以我想做一个登录脚本,我已经对它进行了编码,但是当我运行它时,它总是显示“错误的用户名”,即使它是正确的。

这是我的代码

代码语言:javascript
复制
#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");
    }
}
EN

回答 3

Stack Overflow用户

发布于 2015-12-26 23:18:33

由于类型不匹配,

  • scanf("%s",&UsersInput);是未定义的行为(预期为char*,got char (*)[30])
  • UsersInput == RealUsername是指针的比较,而不是字符串内容的比较。strcmp()对于比较字符串很有用。

在代码开头添加#include <string.h>,并尝试如下所示:

代码语言:javascript
复制
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");
    }
}
票数 7
EN

Stack Overflow用户

发布于 2015-12-26 23:16:35

它总是显示“错误的用户名”,即使它是正确的。

是的,这就是它应该做的。在代码中,

代码语言:javascript
复制
  if (UsersInput == RealUsername)

是错误的。这是,而不是,你应该如何比较字符串。这条语句实际上试图比较指针本身,而不是它们包含的“字符串”。这就是为什么你的if检查不能像他们想的那样工作。

为此,您需要使用strcmp() (在string.h中原型化),例如

代码语言:javascript
复制
if ( !strcmp(UsersInput, RealUsername) )
{
    printf("Logged in\n");
}
else
{
    printf("Wrong Username\n");
}

话虽如此,

为了避免在定义数组时通过较长的inputs.

  • While初始化数组而可能出现的缓冲区溢出,最好将大小分配留给编译器,例如,
  1. int main ()应为int main (void)以符合scanf("%29s",UsersInput);

char RealUsername =“滑行”;

被认为比

char RealUsername20 =“滑行”;

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

票数 3
EN

Stack Overflow用户

发布于 2015-12-26 23:34:18

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

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

原因在于比较语句本身。

代码语言:javascript
复制
if (UsersInput== RealUsername )
    {
        printf("Logged in");
    }

我们在这里不是比较字符串,而是比较它们的地址和它们的地址将始终不同,结果将始终是“.Hence "

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34472592

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档