我将数组的旧元素保存在新数组中。我该如何解决这个问题?

Posted

技术标签:

【中文标题】我将数组的旧元素保存在新数组中。我该如何解决这个问题?【英文标题】:i save the old element of the array in the new array. how can i fix this problem? 【发布时间】:2021-12-12 20:50:53 【问题描述】:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX (10)

struct parola
   char parola1[MAX+1];
   char parola2[MAX+1];
   char parola3[MAX+1];
;

struct parola2
   char parola1x[MAX+1];
   char parola2x[MAX+1];
   char parola3x[MAX+1];
;

struct parola *leggi_file(FILE *fp, int *count)
   int dim = 16;
   int j;
   struct parola *v, *v2;
   int conv = 0;
   char buf[1024];

   if(!(v = malloc(dim *sizeof(*v))))
       free(v);
       puts("non va");
   

   while(fgets(buf, sizeof(buf), fp) != NULL)
       v2 = v + (*count);

       conv =
       sscanf(buf, "%s %s %s", v->parola1, v->parola2, v->parola3);
           printf("\n%s ", v[*count].parola1);
           printf("%s ", v[*count].parola2);
           printf("%s\n", v[*count].parola3);

       if(*count >= dim)
           dim *= 2;
           if(!(v = realloc(v, sizeof(*v)*dim)))
               free(v);
               return NULL;
           
       (*count)++;
       
   
   return v;


void visual(struct parola *v, int count)
   int i;
   for(i=0; i<count; i++)
       printf("%s %s %s\n", v[i].parola1,v[i].parola2,v[i].parola3);
   


int main(int argc, char *argv[])
   int count= 0;
   struct parola *v;
   
   FILE *fp;
   fp= fopen(argv[1], "r");
   if (fp != 0)
    else
       return 1;
       
   
   if(!(v = leggi_file(fp, &count)))
       return 0;
   
   
   visual(v,count);


程序应该从 ./a.out "file1.txt" 中读取每行 3 个单词的文件(非强制性),我需要将它保存在结构 "parola" 中。我的问题是我无法以正确的方式做到这一点。 *保存后,我需要处理结构的单个单词,比如修改 ecc。

文件如下: 字 1 字 2 字 3 (\n) 字 4 字 5 (\n) word6 word7 word8 (\n)

但如果我保存,它应该是相同的,但如果我将其可视化,我会收到: 字 1 字 2 字 3 (\n) 字 4 字 5 字 3 (\n) word6 word7 word8 (\n)

【问题讨论】:

我推荐你使用你的编辑器重新缩进你的代码,一个问题应该会变得很明显。就像您尝试在调试器中单步执行代码一样。 使用sscanf()的返回值,即conv ... conv = sscanf(buf, "%s %s %s", v-&gt;parola1, v-&gt;parola2, v-&gt;parola3); if (conv &gt; 0) printf("\n%s ", v[*count].parola1); if (conv &gt; 1) printf("\n%s ", v[*count].parola2); if (conv &gt; 2) printf("\n%s ", v[*count].parola3); 您希望输出与file1.txt 中的文本相同吗?为什么不直接打印在EOF 之前阅读的内容? 没有空的if 条件,只做if (fp == NULL) return 1; 如果malloc 失败,则在返回的NULL 指针上调用free 是没有意义的,该操作是无操作的。 【参考方案1】:

你有几个主要问题:

    正如第一条关于缩进不佳的评论中提到的那样,您在错误的位置更新了count。这应该无条件地发生,不仅是在count &gt; dim 时。此外,正如@SomeProgrammerDude 所指出的,您没有正确处理realloc。您必须使用临时变量以防万一失败。
if(*count >= dim)
    dim *= 2;
    struct parola* temp = realloc(v, sizeof(*v)*dim);
    if (temp != NULL)
    
      // realloc successful, we can assign temp to our pointer now
      v = temp;
    
    else
    
      // uh oh, realloc failed, it looks like if this happens you just
      // want to bomb out
      free(v);
      return NULL;
    

(*count)++;
    您正在使用v2 (v2 = v + (*count);) 计算v 中的下一个位置,但是当您将当前行存储在v 结构中的文件中时忽略了使用它,因此您继续覆盖v[0] 处的字符串。相反,将sscanf 行更改为
conv = sscanf(buf, "%s %s %s", v2->parola1, v2->parola2, v2->parola3);

此外,您没有检查/使用返回值 conv 来获取任何有用的信息。正如评论所建议的,这应该指导您打印的内容:

conv = sscanf(buf, "%s %s %s", v2->parola1, v2->parola2, v2->parola3);
if (conv >= 1) printf("\n%s ", v[*count].parola1);
if (conv >= 2) printf("%s ", v[*count].parola2);
if (conv == 3) printf("%s", v[*count].parola3);
printf("\n");

由于您的结构都是字符串,最好使用calloc 分配内存,免费为您提供NUL 终止符。

if(!(v = calloc(dim, sizeof(*v))))
   // if you get here, v is NULL, so no need to call free(v), that is a no-op.

Demo 使用stdin 代替文件,并在清理未使用的变量和结构之后。

【讨论】:

以上是关于我将数组的旧元素保存在新数组中。我该如何解决这个问题?的主要内容,如果未能解决你的问题,请参考以下文章

CSV到XML,数组字符串有问题

在数组中声明结构类型的元素

在java中,怎么从一个数组中删除一个数啊

不迭代时如何解决数组中元素的eslint缺少关键道具?

JS数组去重的十种方法

编译器显示错误消息“从不强制转换的整数中生成指针”(反转数组)。我该如何解决这个问题? [关闭]