2017-12-09 10 views
-4

基本的に私は実際のプログラムを入力するためにユーザ名とパスワードを尋ねるプログラムを作りたいと思っています。私はそのようなことをやろうとしましたが、最初のユーザー名とパスワードを入力すると、私はそれを通過させません。一方、私は2番目のユーザー名とパスワードを入力すると動作します。誰かがなぜ私を説明することはできますか?警告とCのユーザ名とパスワード

#include<stdio.h> 
    #include<string.h> 
    #define MAX 100 
    #define LEN 40 

    int names(char listName[][LEN]); 
    void pass(char listPass[][LEN]); 

    int main() 
    { 
    char name[LEN]; 
    char password[LEN]; 
    char listName[MAX][LEN]; 
    char listPass[MAX][LEN]; 
    int i; 

    names(listName); 
    pass(listPass); 


    printf("Enter username: "); 
    scanf("%s", name); 

    printf("Enter password: "); 
    scanf("%s", password); 

    for(i = 0; i< 2; i++) 
    { 
     if (strcmp(listName[i], name) == 0 && strcmp(listPass[i], password) == 0) 
     { 
      printf("Access granted\n"); 
      break; 
     } 
     else 
     { 
      printf("Access denied\n"); 
      break; 
     } 
    } 

    getch(); 
    } 

    int names(char listName[][LEN]) 
    { 
     int i; 
     strcpy(listName[i], "Vince"); 
     strcpy(listName[i], "Jeremy"); 
    } 

    void pass(char listPass[][LEN]) 
    { 
     int i; 
     strcpy(listPass[i], "aBc2xyz8"); 
     strcpy(listPass[i], "fa7saC12"); 
    } 
+1

あなたは常にすべての変数の値を知っている必要があります。関数 'names()'と 'pass()'を入力すると、どのような価値がありますか? – pmg

答えて

1

コンパイルが有効になり、あなたは変数iが初期化されていないここで使用されていることを参照してくださいね。

int names(char listName[][LEN]) 
{ 
    int i; 
    strcpy(listName[i], "Vince"); 
    strcpy(listName[i], "Jeremy"); 
} 

void pass(char listPass[][LEN]) 
{ 
    int i; 
    strcpy(listPass[i], "aBc2xyz8"); 
    strcpy(listPass[i], "fa7saC12"); 
} 

は何あなたが今持っていることは、すなわち何かが起こることができ、未定義の動作です。おそらく、あなたはランダムなクラッシュを得るだろう。あなたはstrcpy(listName[0], "Vince");を意味

、​​


しかし、あなたはが本当にが何をしたいと思うものをmainのうち、*これらの変数を定義し、そこにそれらを初期化することです。また、charへのポインターの配列を使用して、長さの異なるパスワードとユーザー名を許可します。

char *listName[MAX] = { "Vince", "Jeremy" }; 
char *listPass[MAX] = { "aBc2xyz8", "fa7saC12" }; 

int main(void) { ... 

あるいはさらに良い、ユーザデータのための構造を使用します:たとえば名で

struct user_data { 
    char *username, *password; 
}; 

struct user_data users[MAX] = { 
    { "Vince", "aBc2xyz8" }, 
    { "Jeremy", "fa7saC12" } 
}; 
1

()と(合格)あなたは、私は両方のstrcpyの操作はにコピーしようとしている、初期化されていない使用同じ配列インデックス。次のコード

0

は、あなたが意図したものではありません。

int names(char listName[][LEN]) 
{ 
    int i; 
    strcpy(listName[i], "Vince"); 
    strcpy(listName[i], "Jeremy"); 
} 

void pass(char listPass[][LEN]) 
{ 
    int i; 
    strcpy(listPass[i], "aBc2xyz8"); 
    strcpy(listPass[i], "fa7saC12"); 
} 

あなたは私を初期化し、文の間にインクリメント、または単に使用する必要があります。

int names(char listName[][LEN]) 
{ 
    strcpy(listName[0], "Vince"); 
    strcpy(listName[1], "Jeremy"); 
} 

void pass(char listPass[][LEN]) 
{ 
    strcpy(listPass[0], "aBc2xyz8"); 
    strcpy(listPass[1], "fa7saC12"); 
} 
関連する問題