C语言 尝试创建一个int和字符串的动态数组?我不确定我做错了什么

bnl4lu3b  于 2023-03-17  发布在  其他
关注(0)|答案(1)|浏览(113)

我有一个类作业,需要获取一个txt文件,并显示添加删除键(int)和值(string)。
我想为每一个使用一个动态数组(我的教授说如果我这样做可以得到额外的学分)。目前,这就是我所拥有的,我读了txt文件,我把它们添加到数组中。
1.我不知道是否需要为任何单词创建一个具有足够内存的字符串,然后将其复制到一个更小的字符以获得更少的内存(strcpy(savStr, userStr);
1.我不确定是否正确地执行了动态数组,也不确定如何添加更多索引
1.我不知道是否正确地向数组添加了内存

int main(int argc, char **argc) {
    int userNumber; //to take in user key and key in file
    char userStr[1000]; //initial string to take value from user and string
    int strL = 1; //find string length of value to find correct memory need to allocate
    char savStr[strL]; //value with memory allocate for the size of the string
    FILE *fp;
    fp = fopen("values.txt", "r");
    int *keyArry;
    keyArry = (int *)calloc(8, sizeof(int));
    char *valueArry;
    valueArry = (char *)calloc(8, sizeof(char));
    int curr = 0;
    
    while (fscanf(fp, "%d,%s", &userNumber, userStr) != EOF) {
        strL = strlen(userStr);
        savStr[strL];
        strcpy(savStr, userStr);
        printf("%d - %s \n", cuserNumber, savStr);
        keyArry[curr] = userNumber;
        strcpy(&valueArry[curr], &savStr);
        curr++;
    }
    fclose(fp);
    for (int i = 0; i < 7; i++) {
        printf("%d - %s \n", keyArry[i], &valueArry[i]);
    }

这是txt文件

1,one
2,two
3,three
4,four
5,five
6,six
7,seven

这是添加到数组中的内容

3zwjbxry

3zwjbxry1#

代码有未定义的行为,因为char savStr[strL];定义了一个长度为1char数组,刚好够空字符串。复制任何更大的内容会导致未定义的行为。请改用char savStr[1000];。阅读完其余代码后,似乎根本不需要这个额外的数组。
还要注意,char *valueArry;定义了一个指向char的指针,您可以将其初始化为指向8个char的数组,而应该定义一个指向char *的数组的指针并正确地初始化它。
您的教授希望您使用动态数组,因此如果要存储的元素数量超过分配的长度,您可能需要重新分配它们。
以下是修改后的版本:

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

int main(int argc, char **argc) {
    int userNumber;     //to take in user key and key in file
    char userStr[1000]; //initial string to take value from user and string
    FILE *fp = fopen("values.txt", "r");
    if (fp == NULL) {
        fprintf(stderr, "cannot open file values.txt: %s\n", strerror(errno));
        return 1;
    }
    int size = 8;
    int curr = 0;
    int *keyArry = calloc(size, sizeof(*keyArray));
    char **valueArry = calloc(size, sizeof(*valueArry));
    if (keyArry == NULL || valueArry == NULL) {
        fprintf(stderr, "cannot allocate arrays\n");
        return 1;
    }

    while (fscanf(fp, "%d,%999s", &userNumber, userStr) == 2) {
        if (curr >= size) {
            // must reallocate the arrays
            size += size;
            keyArry = realloc(keyArry, size * sizeof(*keyArry);
            valueArry = realloc(valueArry, size * sizeof(*valueArry);
            if (keyArry == NULL || valueArry == NULL) {
                fprintf(stderr, "cannot reallocate arrays\n");
                return 1;
            }
        }
        printf("%d - %s\n", cuserNumber, userStr);
        keyArry[curr] = userNumber;
        valueArry[curr] = strdup(userStr);
        curr++;
    }
    fclose(fp);
    for (int i = 0; i < curr; i++) {
        printf("%d - %s \n", keyArry[i], &valueArry[i]);
    }
    return 0;
}

相关问题