0

为什么总是显示无效密码?它在我的另一个程序中有效,但在这个程序中却不行!我真的不知道为什么。

#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!");
}
4

5 回答 5

3

C 字符串以 NULL 结尾(即最后一个字符是\0)。所有对字符串进行操作的 C 函数都期望这一点,因为这是知道字符串在哪里结束的唯一方法。您的数组可以填充任何内容,因为它未初始化。试试这个:

char password[MAXLTR] = {0};

strcmp需要一个 NULL 终止的字符串。此外,如果从不输入回车(而且我什至看不到buffer声明的位置...),您将超出密码缓冲区。

于 2012-07-17T17:32:25.387 回答
0

看起来您在使用strcmp. C 字符串实用程序期望字符串以空值结尾。

读完密码的每个字符后,在密码中添加一个空字符“\0”:

password[ltrcntr] = '\0';

确保您在数组大小中为空字符允许了一个额外的元素。

于 2012-07-17T17:34:18.080 回答
0

可能是因为您的数组不是 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
于 2012-07-17T17:35:48.370 回答
0

您不能确保在逐个字符检查密码时,最后一个字符后面会出现一个终止 '\0'。密码不是以零结尾的。差不多就是这样。

于 2012-07-17T17:44:00.227 回答
0

无需逐字阅读。

fgets(password,MAXLTR,stdio);

这在换行符或 EOF 之后停止,以 nul 终止字符串,并且不会溢出缓冲区。

于 2012-07-17T18:01:09.050 回答