从文件中分配char *数组

时间:2013-07-23 14:38:40

标签: c arrays file function assign

我在代码中从文件中分配数组时遇到问题。代码的目的是向函数传递一个文件名,一个整数,它将被设置为文件中的行数和每行的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的位置,与值相对。有没有人知道我做错了什么以及如何获得所需的功能?

2 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:0)

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

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

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