如何从 char 数组转换/复制以便我可以将它存储在 char 指针数组中?

How do I cast /copy from a char array so that I may store it in a char pointer array?

我正在从事一个涉及从文本文件读取和/或写入的项目。目前我试图从文本文件中提取的唯一数据是名称。我的目标是能够将特定名称存储在字符指针数组中,这样 Char[n] 将为数组中的任何给定 n 分配一个名称。

我似乎遇到的问题是我将我的字符指针元素设置为另一个字符数组,我在其中存储从文本文件读取的值。

例如,如果我从文本文件中读取一个名称并将 Name[] 设置为该名称然后稍后设置 Char[0] = Name 那么 Char[0] 将始终在 [=15= 时更改] 确实如此。

例如,我曾尝试将字符串直接写入 Char[0],但我的程序在我尝试读取并存储该值后立即崩溃。因此,我采用了这种复杂的方法,即为我扫描的名称分配一个单独的字符数组,并为其设置我的一个元素。

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int main()
{
    FILE * inf = fopen("UserNames.txt", "r");
    char User[125];
    int err, TopNameNumber = 10;
    char *UserNames[TopNameNumber];

    if (inf == NULL) 
    { 
        printf("ERROR: No name file detected."); 
        return 0; 
    }

    for(int i = 0; i < TopNameNumber i++)
    {
        //This reads from my .txt file
        err = fscanf(inf, " %s", User);

        if(err == EOF)
            break;

        //This shows me what user was read from the text file
        printf("User read %d: %s\n", i+1, User); 

        //Program assigns the pointer address of User to Names[i]
        //This is where I'm having trouble
        UserNames[i] = User;
    }

    for(int c = 0; c < 3; c++)
    {
        // This always just prints out the last name read from the .txt file 
           for every name
        printf("Name #%d: %s\n", c, UserNames[c]);
    }

    return 0;
}

我已经在这几天了,我发现了一些可能解决我的问题的有趣途径,例如使用 strcpy() 函数复制字符串,或者转换 User 到某事。然而,到目前为止一切都无济于事。

如果解决方案在这里不明显,我将不胜感激任何关于您认为最佳解决方案的建议。我想避免逐字逐句地做所有事情,但我想我愿意在很长一段时间内这样做 运行.

对于一个可能不清楚的问题,我深表歉意,这是我第一次提出这个问题,我只是想尽可能多地提供背景信息:)

我的代码现在编译时没有警告或错误。

我看到的明显错误在这里:

    //Program assigns the pointer address of User to Names[i]
    //This is where I'm having trouble
    UserNames[i] = User;

所有 用户名重复使用相同的缓冲区是行不通的。另一方面,您不能使用 strcpy 因为没有分配内存。您可以使用 strdup 来分配和复制字符串。

UserNames[i] = strdup(User);

或纯粹主义者(因为 strdup 不严格符合标准):

UserNames[i] = malloc(strlen(User)+1);
strcpy(UserNames[i],User);

作为安全注意事项,由于缓冲区长 125 字节,我建议将它可以接受的输入限制为 124+nul 终止:

err = fscanf(inf, " %124s", User);

当然,您需要在不再使用时释放字符串,否则如果您的程序没有退出或者是更大代码的一部分,您将遇到内存泄漏。

free(UserNames[i]); // in a loop in the end, when no longer needed

您需要为从文件中读取的每个名称单独分配内存char[]

例如:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int main() {
    FILE *inf = fopen("UserNames.txt", "r");
    if (inf == NULL) {
        printf("ERROR: No name file detected.");
        return 0;
    }

    int err, c = 0;

    const int TopNameNumber = 10;
    char UserNames[TopNameNumber][125];

    for(int i = 0; i < TopNameNumber; i++) {
        err = fscanf(inf, " %124s", UserNames[c]);
        if (err == EOF)
            break;

        printf("User read %d: %s\n", c+1, UserNames[c]);
        ++c;
    }

    fclose(inf);

    for(int i = 0; i < c; i++) {
        printf("Name #%d: %s\n", i, UserNames[i]);
    }

    return 0;
}

或者:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int main() {
    FILE *inf = fopen("UserNames.txt", "r");
    if (inf == NULL) {
        printf("ERROR: No name file detected.");
        return 0;
    }

    char User[125];
    int err, c = 0;

    const int TopNameNumber = 10;
    char* UserNames[TopNameNumber];

    for(int i = 0; i < TopNameNumber; i++) {
        err = fscanf(inf, " %124s", User);
        if (err == EOF)
            break;

        printf("User read %d: %s\n", c+1, User);

        UserNames[c] = malloc(strlen(User) + 1);
        if (UserNames[c] == NULL) {
            printf("ERROR: Memory allocation failed.");
            break;
        }

        strcpy(UserNames[c], User);
        ++c;
    }

    fclose(inf);

    for(int i = 0; i < c; i++) {
        printf("Name #%d: %s\n", i, UserNames[i]);
    }

    for(int i = 0; i < c; i++) {
        free(UserNames[i]);
    }

    return 0;
}