Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么密码中的strcmp()不起作用?_C_String_Strcmp - Fatal编程技术网

为什么密码中的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在这种情况下有点特殊,并且