为什么密码中的strcmp()不起作用?
为什么它总是显示无效密码?它在我的另一个程序中有效,但在这个程序中无效!我真的不明白为什么为什么密码中的strcmp()不起作用?,c,string,strcmp,C,String,Strcmp,为什么它总是显示无效密码?它在我的另一个程序中有效,但在这个程序中无效!我真的不明白为什么 #include <stdio.h> #include <stdlib.h> #include <windows.h> #include <conio.h> #define MAXLTR 15 int login(void); void welcome(void); void gotoxy(int x,int y); int main(void) {
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <conio.h>
#define MAXLTR 15
int login(void);
void welcome(void);
void gotoxy(int x,int y);
int main(void)
{
char password[MAXLTR];
printf("\nEnter password: ");
//scanf("\n%s",&password);
ltrcntr = 0;
while(buffer != 13)
{
buffer = getch();
if(buffer == 13)
break;
printf("\b**");
password[ltrcntr] = buffer;
ltrcntr++;
}
if(strcmp(password,"dlsu") == 0)
{
system("cls");
welcome();
}
else
printf("\nInvalid Password, please rerun the program.\n");
}
void gotoxy(int x, int y)
{
HANDLE eric;
COORD pogi;
pogi.X = x;
pogi.Y =y;
eric = GetStdHandle
(STD_OUTPUT_HANDLE);
SetConsoleCursorPosition
(eric, pogi);
}
int login(void)
{
char password[MAXLTR],buffer;
int ltrcntr = 0;
printf("Enter password: ");
while(buffer != 13)
{
buffer = getch();
if(buffer == 13)
break;
printf("\b**");
password[ltrcntr] = buffer;
ltrcntr++;
}
if(strcmp(password,"dlsu")==0)
return 1;
}
void welcome(void)
{
system("Color 4F");
gotoxy(35,56);
printf("\nWelcome to SPACE INVADERS!");
}
#包括
#包括
#包括
#包括
#定义maxltr15
int登录(void);
欢迎无效(无效);
void gotoxy(int x,int y);
内部主(空)
{
字符密码[MAXLTR];
printf(“\n输入密码:”);
//scanf(“\n%s”和密码);
ltrcntr=0;
while(缓冲区!=13)
{
buffer=getch();
如果(缓冲区==13)
打破
printf(“\b**”);
密码[ltrcntr]=缓冲区;
ltrcntr++;
}
if(strcmp(密码,“dlsu”)==0)
{
系统(“cls”);
欢迎();
}
其他的
printf(“\n密码无效,请重新运行程序。\n”);
}
void gotoxy(整数x,整数y)
{
处理埃里克;
库德·波吉;
pogi.X=X;
pogi.Y=Y;
eric=GetStdHandle
(标准输出手柄);
设置控制台位置
(埃里克,波吉);
}
int登录(无效)
{
字符密码[MAXLTR],缓冲区;
int ltrcntr=0;
printf(“输入密码:”);
while(缓冲区!=13)
{
buffer=getch();
如果(缓冲区==13)
打破
printf(“\b**”);
密码[ltrcntr]=缓冲区;
ltrcntr++;
}
if(strcmp(密码,“dlsu”)==0)
返回1;
}
欢迎无效(无效)
{
系统(“彩色4F”);
gotoxy(35,56);
printf(“\n欢迎来到太空入侵者!”;
}
C字符串以NULL结尾(即最后一个字符是\0
)。所有对字符串进行操作的C函数都会遇到这种情况,因为这是知道字符串结束位置的唯一方法。由于数组未初始化,所以可以用任何东西填充它。试试这个:
char password[MAXLTR] = {0};
strcmp
需要以NULL结尾的字符串。此外,如果从未输入回车符(我甚至不知道在哪里声明了缓冲区),您将溢出密码缓冲区。C字符串以NULL结尾(即最后一个字符是\0
)。所有对字符串进行操作的C函数都会遇到这种情况,因为这是知道字符串结束位置的唯一方法。由于数组未初始化,所以可以用任何东西填充它。试试这个:
char password[MAXLTR] = {0};
strcmp
需要以NULL结尾的字符串。此外,如果从未输入回车符(我甚至不知道在哪里声明了缓冲区
),您将溢出密码缓冲区。在使用strcmp
之前终止密码缓冲区似乎不是空的。C字符串实用程序希望字符串以null结尾
读取完密码的每个字符后,在密码中添加一个空字符“\0”:
password[ltrcntr] = '\0';
确保在数组大小中为空字符允许了一个额外的元素。在使用strcmp
之前终止密码缓冲区似乎不是空的。C字符串实用程序希望字符串以null结尾
读取完密码的每个字符后,在密码中添加一个空字符“\0”:
password[ltrcntr] = '\0';
确保在数组大小中为空字符允许了一个额外的元素。可能是因为数组不是以空结尾的。要么先将其归零,要么将循环更改为如下所示:
while(ltrcntr < MAXLTR - 1) // protect from password that's too long
{
buffer = getch();
if(buffer == 13)
break;
password[ltrcntr] = buffer;
ltrcntr++;
printf("\b**");
}
password[ltrcntr] = 0; // null terminate after last character
while(ltrcntr
可能是因为您的数组不是以NULL结尾的。要么先将其归零,要么将循环更改为如下所示:
while(ltrcntr < MAXLTR - 1) // protect from password that's too long
{
buffer = getch();
if(buffer == 13)
break;
password[ltrcntr] = buffer;
ltrcntr++;
printf("\b**");
}
password[ltrcntr] = 0; // null terminate after last character
while(ltrcntr
您无法确保在逐个字符检查密码时,最后一个字符后面会出现终止“\0”。密码不是以零结尾的。这几乎就是全部。您无法确保在逐个字符检查密码时,最后一个字符后面会出现终止“\0”。密码不是以零结尾的。差不多就这些了。逐字阅读是不必要的
fgets(password,MAXLTR,stdio);
换行符或EOF、nul终止字符串后,此操作将停止,并且不会超出缓冲区。不需要逐个字符读取
fgets(password,MAXLTR,stdio);
换行符或EOF后,nul将终止字符串,并且不会溢出缓冲区。看起来您不是在nul终止密码。
此外,密码最多14个字母?调试器创造奇迹…:)@神秘,你刚刚失去了90个名声@沙巴兹:非常正确!每个人都知道。看起来你不是在终止password
。还有,密码最多14个字母?调试器创造奇迹…:)@神秘,你刚刚失去了90个名声@沙巴兹:非常正确!每个人都知道。如果数组中有任何垃圾字符,这将不起作用。@Wug:不知道你的意思。数组将使用我建议的方法初始化为所有0
<代码>0在这种情况下有点特殊,将初始化每个元素。如果值不为零,则情况并非如此。可能我只是看到了一些我无法识别的东西。@Wug:char someArray[n]={0}
会将每个元素初始化为0
charsomearray[n]={1}
只会将第一个元素初始化为1
,同样地,charsomearray[n]={1,1}
会初始化前两个元素,等等。是的,我刚刚查过。闻起来像是语言的味道,如果数组中有垃圾字符,它就不起作用了。@Wug:不知道你的意思。数组将使用我建议的方法初始化为所有0
<代码>0在这种情况下有点特殊,并且