我的函数在被调用时似乎只接收字符串的第一个字符

问题描述 投票:0回答:1

我正在为学校项目构建基本注册功能,当我尝试从数据库中检查用户名和密码时,不断收到错误。这个想法是让用户输入他们的登录信息,然后让一个函数接收该信息并将其与数据库中的用户信息进行比较。如果匹配,它将从表中检索用户 ID 并将其附加到变量以供以后使用。我现在遇到一个问题,当我将用户输入传递到密码匹配函数时,该函数似乎只接收输入的第一个字符。这就是调试器显示的内容。我可能读错了调试器,但我不确定这是第一个函数

void loginUser(){
    
    char email[100];
    char password[50];

    // Input login details
    printf("Enter email: ");
    fgets(email, sizeof(email), stdin);
    email[strcspn(email, "\n")] = '\0'; // Remove newline character
    printf("Enter password: ");
    fgets(password, sizeof(password), stdin);
    password[strcspn(password, "\n")] = '\0'; // Remove newline character
        
    printf("Email: %s\n", email);

    printf("Email: %s\n", password);

    // Check email and password against database
    if(password_match(email, password)){
        printf("Success");
    };

    // If authenticated, proceed to main menu
    // Else, show error message and redirect to login
};

这是从mysql数据库获取用户名和密码的函数

int password_match(const char *email, const char *password) {

//    printf("Email: %s\n", email);

//     printf("Email: %s\n", password);

    MYSQL_RES *result;
    MYSQL_ROW row;
    char query[512];
    snprintf(query, sizeof(query), "SELECT consumerID FROM CurrentConsumer WHERE email='%s' AND password='%s'", email, password);
    
    if (mysql_query(con, query)) {
        fprintf(stderr, "Error querying database: %s\n", mysql_error(con));
        return 0; // Failure
    }
    
    result = mysql_store_result(con);
    if (result == NULL) {
        fprintf(stderr, "Error storing result: %s\n", mysql_error(con));
        return 0; // Failure
    }
    
    row = mysql_fetch_row(result);
    if (row == NULL) {
        mysql_free_result(result);
        return 0; // No match
    }
    
    // Print the consumer ID
    printf("Consumer ID: %s\n", row[0]);
    
    mysql_free_result(result);
    return 1; // Match
}

我尝试使用按值传递和按引用传递,但无法使其工作。这很奇怪,因为我有另一个函数可以很好地将数据插入数据库。我用它来构建这个函数,但无法让它工作。

mysql c authentication variables pass-by-reference
1个回答
0
投票

我现在遇到一个问题,当我将用户输入传递到密码匹配函数时,该函数似乎只接收输入的第一个字符。

这是函数原型:

   int password_match(const char* a, const char* b) 

password_match()
接收2个指向
char
的指针。根本没有
char
。指针可以指向
NULL
,指向有效或无效的
NULL
终止的事物,但只是指向某些地址的指针。

它接收单个字母字符串的唯一方法是

a[0]
是一个字母并且
a[1]
为零,或者对于
b
来说也是如此。

关于代码

  • loginUser()
    只是 2 个字符串的包装,以便测试
    password_match()
    。不要编写交互式代码来测试您的程序。这只会花费您时间。很多时间。只需将 2 个字符串传递给
    loginUser
    并返回用户 id
  • 不要使用
    void f(void)
    :这个东西不会获取任何数据并且不会返回任何内容,因此将完全依赖于全局外部数据。
  • 检查数据库中的用户和密码的代码与此处无关:您只想测试进入
    password_match()
  • 的参数
  • 请勿混合使用 snake_casecamelCase。一般来说,在
    C
    中,我们期望 Snake_case,但无论如何都要保持一致。
© www.soinside.com 2019 - 2024. All rights reserved.