0

Invalid Passwordが常に表示されるのはなぜですか? 私の他のプログラムでは動作しますが、このプログラムでは動作しません! 私は文字通り理由を理解できません。

#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};

strcmpNULL で終了する文字列が必要です。また、キャリッジ リターンが入力されていない場合 (そして、どこで宣言されているかさえわかりませんbuffer...)、パスワード バッファーをオーバーランしてしまいます。

于 2012-07-17T17:32:25.387 に答える
0

文字ごとに読む必要はありません。

fgets(password,MAXLTR,stdio);

これは、改行またはEOFの後で停止し、文字列をnulで終了し、バッファをオーバーランしません。

于 2012-07-17T18:01:09.050 に答える
0

パスワードが文字ごとにチェックされるため、終了する「\0」が最後の文字の後に続くことを保証しているわけではありません。パスワードはゼロで終了していません。それがほとんどすべてです。

于 2012-07-17T17:44:00.227 に答える
0

を使用する前に、パスワード バッファを null で終了していないようですstrcmp。C 文字列ユーティリティは、文字列が null で終了することを想定しています。

パスワードの各文字を読み終わったら、ヌル文字 '\0' をパスワードに追加します。

password[ltrcntr] = '\0';

null 文字の配列サイズに余分な要素を許可していることを確認してください。

于 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 に答える