c - 将字符串写入动态分配的数组

标签 c arrays dynamic malloc strcpy

每次尝试将字符串写入动态分配的字符串数组时,我都会收到 4 条错误消息“通过 strcpy 的参数 1 使指针来自整数而不进行强制转换”。我知道这显然与我的 strcpy 调用有关,并且这是某个地方的类型不匹配问题,但我需要一些帮助。

/* ---- LIBRARIES ---- */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/* ---- PROTOTYPES ---- */
int readFx(char** arr);

/* int sortFx(char** arr, int arg2);
int printFx(char** arr, int arg2); */

int freeFx(char** arr, int cnt);
char* getToken(char arr1[], int loc);
void makeRoom(char*** t, int size);

/* ---- MAIN ---- */
int main(void)
{
    char** pntrArr;
    char* fileText;
    int iniArrSize = 10;
    int recCnt = 0;

    /* array to store addresses of arrays forming the rows */
    pntrArr = malloc(iniArrSize * sizeof(char*));

    recCnt = readFx(pntrArr);
    sortFx(pntrArr, recCnt);
    /* printFx(pntrArr, recCnt); */
    freeFx(pntrArr, recCnt);

    return;
}

/* ---- FUNCTIONS ---- */

int readFx(char** arr)
{
    /*
    input: csv file of string arrays
    output: count of records received
    purpose: read file, store values in array and populate pointer array
    */

    char buffer[350];
    char temp[350];
    char*** reallocTemp;
    char* token;
    int counter, index;
    int subLoc = 3;
    int enrLoc = 8;
    int arrSize = 10;

    /* Clear headers */
    fgets(buffer, sizeof(buffer), stdin);

    counter = 0;

    /* While file stream is not null */
    while (fgets(buffer, sizeof(buffer), stdin) != NULL)
    {
        /* Populate array within array if pntr arr has room */
        if(counter <= arrSize)
        {
            /* buffer copy*/
            strcpy(temp, buffer);
            index = 0;

            /* create array for token values */            
            arr[counter] = malloc(10 * sizeof(char));

            /* Get first token */
            token = getToken(temp, subLoc);

            strcpy(arr[counter][index],token);
            index++;

            /* Get second token */
            token = getToken(temp, enrLoc);

            strcpy(arr[counter][index], token);

            counter++;
        }
        else
        {
            /* Reallocate memory due to necessary expansion */
            makeRoom(&arr, arrSize);

            /* Realloc was successful */
            if(temp != NULL)
            {
                arrSize = arrSize * 2;

                /* Print Reallocation info */
                printf("reallocating to %d", arrSize);

                /* Populate values for current buffer now that you have realloc'd */ 

                /* buffer copy*/
                strcpy(temp, buffer);
                index = 0;

                /* create array for token values */
                arr[counter] = malloc(10 * sizeof(char));

                /* Get first token */
                token = getToken(temp, enrLoc);

                strcpy(arr[counter][index], token);
                index++;

                /* Get second token */
                token = getToken(temp, subLoc);
                strcpy(arr[counter][index], token);

                counter++;
            }
            else
            {
                printf("unable to reallocate\n");
                exit(1);
            }
    }

    return counter;

}


char* getToken(char arr1[], int loc)
{
    /*
    input: string array & location of desired string
    output: string of token at position
    purpose: grab string (char*) of certain position in given array
    */

    int loopCnt;
    char* del = ",\n";

    /* Grab first token */
    char* token = strtok(buffer, del);

    /* Loop through array to grab value at given location */
    for(loopCnt = 1; loopCnt < loc; loopCnt++)
    {
        token = strtok(NULL, del);
    }

    return token;
}

int freeFx(char** arr, int cnt)
{
    int i;

    for(i = 0; i < cnt; i++)
    {
        free(arr[i]);
    }

    free( arr ); 
    return 0;
}

void makeRoom(char*** t, int size)
{
    *t = realloc(*t, size * 2  * sizeof(char*));
}

最佳答案

来自代码:

strcpy(arr[counter][index],token);

arr[counter][index]指的是数组的单个字符,所以请用arr[counter]代替那个(指向动态分配 block 的指针),

这样您就可以将字符串复制到该动态数组。

添加额外的细节,如果你使用如下的 strcpy,

strcpy(arr[计数器][索引], token );

仍然复制完成,但位置不正确,

假设 arr[counter] 保存着一个 char 指针的地址,它是 1000。

所以 strcpy(arr[counter][index],token);将复制地址 1000 + 索引中的字符串。

strcpy(arr[counter],token) 会复制地址1000中的字符串

希望对您有所帮助。

关于c - 将字符串写入动态分配的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35931865/

相关文章:

c - struct c 动态分配内存

c - 如何 MPI_SEND 和 MPI_RECV

c - 适用于 Windows 的样例 Splint 选项文件

java - 在 Java 中比较数组

android - 如何从for循环中传递三个字符串

c++ - 动态内存分配是如何工作的

javascript - 如何从动态创建的表中删除信息

c - 如何修复 "undefined reference to createList"

Ruby 动态数组 : undefined local variable or method `s' for main:Object (NameError)

javascript - forEach 数组中仅添加 JavaScript 中的最后一个值