2

我在从代码中的文件分配数组时遇到问题。代码的目的是向函数传递一个文件名、一个整数(将设置为文件中的行数)和一个 char* 数组,每行一个,在函数内打开文件,每个行传递到数组中。

我要打开的文件是 Storelist.txt 并包含:

842B
832B
812B
848B

代码中的主要功能是:

#include <stdio.h>
#include <string.h>
#include <stdbool.h>
#include <stdlib.h>     /* strtol */
void pass_list(int *final_legnth_list, char* filename, char* final_list[]);
main(int argc, char* argv[])
{
   int store_n=0;
   char* store_param= "storelist.csv";
   char* store_list[100]={0};

   pass_list(&store_n,store_param, store_list);


   printf("STATUS: size of array [%i]\n",store_n);
   int jj=0;
   for(jj=0;jj<store_n;jj++){
        printf("Number: %i  is store:  [%s]\n",jj, store_list[jj]);
   }
   return 0;
}

最后的功能是:

void pass_list(int *final_legnth_list, char* filename, char* final_list[]){
    FILE *temp_file;  //opening the file
    temp_file = fopen (filename, "rt");
    int ii=0;
    if (temp_file!=NULL){
        char temp_line[30]; 
        char temp_item[30];
        while(fgets(temp_line, 30, temp_file) != NULL){ //looping over the lines
            sscanf(temp_line,"%s",temp_item);   //getting the value without the end line
            printf("STATUS:output =  [%s]\n",temp_item);
            final_list[ii] = temp_item;  //setting the array
            ii++;
        }
        (*final_legnth_list) = ii;
    }
}

最终输出显示:

STATUS:output =  [842B]
STATUS:output =  [832B]
STATUS:output =  [812B]
STATUS:output =  [848B]
STATUS: size of array [4]
Number: 0  is store:  [848B]
Number: 1  is store:  [848B]
Number: 2  is store:  [848B]
Number: 3  is store:  [848B]

所以它正在从文件中读取正确的值,但它总是以某种方式完成分配给文件的最终值。

我认为这可能是由于数组存储的是 temp_item 的位置,而不是值。有谁知道我做错了什么以及如何获得所需的功能?

4

2 回答 2

1
final_list[ii] = temp_item;  //setting the array

您正在分配局部变量的值

而是复制该值:

strcpy(final_list[ii], temp_item);  //setting the array

另请注意,您必须为malloc要存储在数组中的每个字符串保留空间(使用),free最后是一个简化的示例:

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

int main(void)
{
    char *store_list[100];
    char *list[] = {
        "842B",
        "832B",
        "812B",
        "848B"
    };
    int i;

    for (i = 0; i < 4; i++) {
        store_list[i] = malloc(strlen(list[i]) + 1); /* +1 for trailing 0 */
        if (store_list[i] == NULL) { /* always check the return of malloc */
            perror("malloc");
            exit(EXIT_FAILURE);
        }
        strcpy(store_list[i], list[i]);
    }
    for (i = 0; i < 4; i++) {
        printf("%s\n", store_list[i]);
        free(store_list[i]);
    }
    return 0;
}
于 2013-07-23T14:41:55.540 回答
0

我在这段代码中看到了两个问题。

1)store_list变量声明为char* store_list[100]={0};. 该变量可以包含一个指向一个包含 100 个char值的数组的指针。通过调用来访问这个变量store_list[jj]是可能的,但不正确,除非您将数据设计为小于sizeof(char*). 以这种方式设计代码是可能的,但存在许多缺陷,包括您可能无法指望指针在所有系统上的大小都相同。

2) 您必须使用字符串复制功能将字符数据从一个内存位置复制到另一个内存位置。您只是通过 assignment 分配了temp_itemto的指针位置。我建议查找或更安全的版本来限制要复制的字符数。final_list[ii]final_list[ii] = temp_item;strcpy

于 2013-07-23T14:52:33.043 回答