繁体   English   中英

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

[英]C: Reading in a file of strings into an array of 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数组。

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

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


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


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

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

     char fragments[2000][20]; //can hold 2000 19-character strings for(i=0; i<N; i++){ scanf("%d", fragments[i]); } 

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

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

     char* fragments[2000]; char entry[MAX_FRAGMENT_LENGTH]; //temporary buffer for strings for(i=0; i<N; i++){ scanf("%d", entry[i]); //dynamically allocate an array, just big enough to fit our string in. fragments[i] = malloc(sizeof(char) * (1 + strlen(entry)); strcpy(fragments[i], entry); } 

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

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

     char buffer[2000*20]; char* fragments[2000]; char* next_empty_location = buffer; for(i=0; i<N; i++){ scanf("%d", next_empty_location); fragments[i] = next_empty_location; next_empty_location += strlen(next_empty_location) + 1; } 

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM