0

この形式の質問が以前にもあったことは知っていますが、自分の状況に合った質問を見つけるのに苦労しています.

C に慣れようとしている人として、ポインター、特に文字列に問題があります。少数のエラーが発生し続けており、自分が間違っていることに頭を悩ませることはできません。

ユーザー名:パスワードのキー/値を読み取り、それらを特定の値と比較するプログラムを作成しています。そのために、userpass 構造体を使用します。

typedef struct {
char user[BUF_MAX];
char pass[BUF_MAX];
} userpass;

そして、次のコード:

char *authThread(char *filename, char *request){

List_t logins;
char user[BUF_MAX];
char pass[BUF_MAX];
char *saveptr = NULL;
char *listptr = NULL;

char *username = strtok_r(request, ":", &saveptr);
char *password = strtok_r(NULL, ":", &saveptr);

char *failCode = malloc(sizeof (char)*BUF_MAX);
sprintf(failCode, "0:%s:0", username);

char *successCode = malloc(sizeof (char)*BUF_MAX);
sprintf(successCode, "1:%s:%s", username, ticketSecret);

if (List_init(&logins)){

  //Retrieve all the user:pass pairs from the auth file
  FILE *fp = fopen(filename, "r");
  while(fscanf(fp, "%s:%s", user, pass) != EOF){
    userpass new;
    //PROBLEM LINES BELOW+++++++++++++++++++++++++++++++++
    strcpy(new->user, user);
    strcpy(new->pass, pass);
    List_add_tail(&logins, &new);
  }//while
  fclose(fp);

  //See if the username/pass combination provided exists in the auth file
  for (;;){
    userpass *next = NULL;
    //PROBLEM LINE BELOW+++++++++++++++++++++++++++++++++
    List_next_node(&logins, &listptr, &next);
    if (next == NULL) break;

    //Match found, return required auth string
    if (strcmp(next->user, username) == 0 && strcmp(next->pass, password) == 0){
      return successCode;
    }//if
  }//for

  return failCode;

}//if
else{
  printf("Error creating auth list\n");
}//else

}//authThread

List_t は、リンクされたリストの実装です。List_next_node 関数のヘッダーは次のとおりです。

int List_next_node ( List_t *list, void **context, void **data );

上記のエラーが発生した 2 行にラベルを付けました。コンパイルしようとすると、2 つのエラーが発生します。最初の 2 行で、次のようになりますinvalid type argument of â->â

2行目で、次のようになります。passing argument 2(3) of âList_next_nodeâ from incompatible pointer type

これらの問題は両方とも、変数が正しい型ではないことが原因であることがわかりますが、それがどのように可能であるかはわかりません。最初のケースでnew->userは、 と同様に char 配列にする必要がありuserます。

2 番目のケースでは、List_next_node は 3 つのパラメーターを受け入れます。リストへのポインター、コンテキスト ポインターへのポインター、およびデータ ポインターへのポインター。私が知る限り、すべてが本来あるべきタイプです。Cで文字列(つまり、char配列)がどのように機能するかという問題があるとしか想像できません。

4

2 に答える 2