【问题标题】:Cannot access memory at address with strtok()无法使用 strtok() 访问地址处的内存
【发布时间】:2020-10-29 00:05:43
【问题描述】:

我正在学习 C,我需要构建代码来读取和比较来自 CSV 文件的用户登录信息。我正在尝试使用strtok()function 将数组中的 CSV 值分开。但是当我调试代码(使用 Visual Studio 代码)时,它会在 user_data_column = strtok(line, ','); 行显示错误 Cannot access memory at address。我没有找到特定案例的搜索结果,但在成功之内。完整代码:

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <limits.h>
#include <string.h>
#include <locale.h>
    
char username[50], password[50];
char cwd[PATH_MAX];
void show_login()
{
    typedef struct
    {
        char *user;
        char *password;
    } * user;

    char *user_data_column;
    user *user_data;

    getcwd(cwd, sizeof(cwd));
    strcat(cwd, "/data/Users.csv");

    FILE *users_list = fopen(cwd, "r");
    long file_length = ftell(users_list);
    char *buffer = malloc(file_length);
    char line[PATH_MAX];
    int line_counter = 0;
    int is_authorized = 0;

    printf("\bLogin\n");
    printf("Nome do usuário: ");
    fgets(username, sizeof(username), stdin);
    printf("Senha: ");
    fgets(password, sizeof(password), stdin);

    if (users_list)
    {
        if (buffer)
        {
            while (fgets(line, sizeof(line), users_list) != NULL)
            {
                if (line_counter == 0)
                {
                    line_counter++;

                    continue;
                }
                user_data_column = strtok(line, ',');
            }
        }
    }
    else
    {
        printf("Erro! O arquivo Users.csv não foi encontrado\n");
        exit(1);
    }
    fclose(users_list);
}

int main()
{
    show_login();
    return 0;
}

(比较登录的步骤没有完成) 错误:

【问题讨论】:

  • strtok() 的第二个参数应该是字符串,而不是char
  • strtok(line, ",")
  • 你应该在编译时收到关于类型不匹配的警告。
  • user typedef 可能不应该是指针。
  • 另请注意,如果您在同一字符串上多次调用strtok(),则只有第一个调用使用strtok(line, ...;,所有后续调用都使用strtok (NULL, ...。跨度>

标签: arrays c pointers strtok


【解决方案1】:

你用单引号传递,在第二个参数中使用双引号。

  strtok(line, ",");

【讨论】:

    猜你喜欢
    • 2018-09-08
    • 2013-02-18
    • 1970-01-01
    • 2013-10-30
    • 1970-01-01
    • 2017-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多