C:将字符串文件读入char * s数组

我有类似的东西(没有间距问题),我正在读取一个文件,其中的字符串由#符号分隔,并尝试将每个字符串读取为char * s数组。 但是,每个包含字符串的char*都是字符串的确切长度。 虽然这是一个小马车。

 char * fragments[1000]; char temp[20]; while (i < numFrags) { if (fscanf(fp, "#%15[^#]#", temp) == 1) { char entry[strlen(temp)]; entry = strcpy(entry, temp); fragments[i++] = entry; printf("%d\n", strlen(temp)); } } 

思考?

您的问题是您正在重用entry数组。

看看我们有没有fragments[i++] = entry; 。 最后,每个片段都将指向同一个位置,因此将包含相同的字符串(在这种情况下,它将是最后读取的字符串)。

看起来好像你试图通过同时使用tempentry数组来解决这个问题,但最后你也可以将fscanf直接写入entry数组。


你可以得到的另一个问题是你的指针指向一个在堆栈上自动分配的数组(即:在函数内声明的数组)。 函数返回后,程序会重用这些内存位置,指针可以开始指向无效数据(因为这是C,使用这些损坏的字符串会导致各种崩溃和错误的程序行为)。


你的问题基本上是一个内存分配问题,所以有很多解决方案。

  1. 使fragments成为字符数组的数组(而不仅仅是指针)。 这样,您可以安全地为每个字符串提供不同的内存。

     char fragments[2000][20]; //can hold 2000 19-character strings for(i=0; i 

    这种解决方案的优点是它很简单,并且所有内存都是事先分配的。

  2. 使用malloc动态内存分配。 这允许您为每个字符串选择不同大小的数组,并允许您在运行时而不是编译时选择数组的大小。

     char* fragments[2000]; char entry[MAX_FRAGMENT_LENGTH]; //temporary buffer for strings for(i=0; i 

    这种方法的主要优点是它非常灵活,同时仍然相当简单。 主要的缺点是你需要free所有已完成malloc -ed的指针(否则你会得到内存泄漏)。

  3. 手动执行“动态分配”,使用单个大缓冲区来包含所有字符串。

     char buffer[2000*20]; char* fragments[2000]; char* next_empty_location = buffer; for(i=0; i 

    如果您不能/不希望/不允许使用malloc解决方案,那么这就是最接近的。 它可能更难理解(如果你遇到C的问题),但是最好似乎适合模糊的“每个字符串*包含字符串很多是字符串的确切长度”限制。