この形式の質問が以前にもあったことは知っていますが、自分の状況に合った質問を見つけるのに苦労しています.
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配列)がどのように機能するかという問題があるとしか想像できません。