所以我想创建一个登录脚本并且我编写了它但是当我运行它时,它总是说"错误的用户名"即使它是对的。
这是我的代码
#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");
}
}
答案 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");
}
话虽如此,
int main ()
应int main (void)
符合标准。scanf("%s",&UsersInput);
最好是scanf("%29s",UsersInput);
,以避免更长的输入可能导致缓冲区溢出。在定义时初始化数组时,最好将大小分配留给编译器,例如,
char RealUsername[ ] = "slither";
被认为比
更好char RealUsername[20] = "slither";
有时,它会省去忘记终止空字符大小的计数。
答案 2 :(得分:1)
包括@sourav在内的许多其他人已经给出了使用strcmp的解决方案。
我想指出为什么它总是给出“错误的用户名”作为输出。
原因在于比较陈述本身。
if (UsersInput== RealUsername )
{
printf("Logged in");
}
我们不是在这里比较字符串,而是在比较他们的地址。他们的地址总是不同。因此,结果总是“用户名错误”