【问题标题】:why wont strcmp() in password work?为什么 strcmp() 在密码中不起作用?
【发布时间】:2012-07-17 17:30:12
【问题描述】:

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

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

【问题讨论】:

  • 看起来你不是在终止password
  • 另外,密码最多 14 个字母?
  • 调试器创造奇迹... :)
  • @Mysticial,你刚刚失去了 90 个声望!
  • @Shahbaz:非常真实!大家都知道you need 25 letters for a good password

标签: c string strcmp


【解决方案1】:

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

char password[MAXLTR] = {0};

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

【讨论】:

  • 如果数组中有任何垃圾字符,这将不起作用。
  • @Wug:不知道你的意思。数组将使用我建议的方法初始化为所有00 在这种情况下有点特殊,它将初始化每个元素。如果该值不为零,则情况并非如此。
  • 也许我只是看到了一些我不认识的东西。
  • @Wug: char someArray[n] = {0} 会将 every 元素初始化为 0char someArray[n] = {1}仅将第一个 元素初始化为1,同样char someArray[n] = {1, 1} 将初始化前两个,依此类推。
  • 是的,我刚刚查了一下。闻起来像我的语言气味
【解决方案2】:

可能是因为您的数组不是以 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

【讨论】:

    【解决方案3】:

    在使用strcmp 之前,您似乎没有对密码缓冲区进行空值终止。 C 字符串实用程序期望字符串以空值结尾。

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

    password[ltrcntr] = '\0';
    

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

    【讨论】:

      【解决方案4】:

      无需逐字阅读。

      fgets(password,MAXLTR,stdio);
      

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

      【讨论】:

        【解决方案5】:

        由于密码是逐个字符检查的,因此您不能确保在最后一个字符之后有一个终止的 '\0'。密码不是以零结尾的。差不多就这些了。

        【讨论】:

        • 他没有存储回车,他正在检查它并提前中断循环。
        • 嗯好吧 'while(buffer != 13)' 让我很困惑。我的错,我猜它是空终止的字符串。编辑了我的帖子
        • 可以理解,这不是读取字符串最惯用的方式。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-15
        • 1970-01-01
        • 2021-10-12
        相关资源
        最近更新 更多