如何从char数组强制转换/ copy以便将其存储在char指针数组中?

时间:2018-09-29 07:34:46

标签: c arrays c-strings stdio

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

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

例如,如果我从文本文件中读取一个名称,并将Name[]设置为与该名称相同,然后再设置Char[0] = Name,则Char[0]将始终在Name执行时更改

例如,我曾尝试将字符串直接写入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强制转换为的东西。到目前为止,一切都无济于事。

如果您认为最佳解决方案在这里并不明显,那么我将提供任何建议。我想避免一个字一个字地做所有事情,但是从长远来看,我想我愿意。

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

到目前为止,我的代码编译时没有警告或错误。

2 个答案:

答案 0 :(得分:4)

我看到的公然错误在这里:

SELECT difference(last(value)) FROM E_real_con WHERE time >= now() - 7d GROUP BY time(1d) fill(null)

all 用户名重复使用相同的缓冲区不会成功。另一方面,由于未分配内存,因此无法使用ERR: unsupported difference iterator type: *query.stringInterruptIterator 。您可以使用 //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);

作为安全说明,由于缓冲区的长度为125个字节,因此我建议将其可接受的输入限制为124 + nul-termination:

strdup

当然,当不再使用这些字符串时,您需要对其进行分配,否则,如果您的程序不退出或者是更大代码的一部分,则会导致内存泄漏。

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

答案 1 :(得分:0)

您需要为从文件中读取的每个名称分配一个单独的root内存。

例如:

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;
}