我将数组的旧元素保存在新数组中。我该如何解决这个问题?
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->parola1, v->parola2, v->parola3); if (conv > 0) printf("\n%s ", v[*count].parola1); if (conv > 1) printf("\n%s ", v[*count].parola2); if (conv > 2) printf("\n%s ", v[*count].parola3);
您希望输出与file1.txt
中的文本相同吗?为什么不直接打印在EOF
之前阅读的内容?
if
条件,只做if (fp == NULL) return 1;
malloc
失败,则在返回的NULL 指针上调用free
是没有意义的,该操作是无操作的。你有几个主要问题:
-
正如第一条关于缩进不佳的评论中提到的那样,您在错误的位置更新了
count
。这应该无条件地发生,不仅是在count > 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
代替文件,并在清理未使用的变量和结构之后。
【讨论】:
以上是关于我将数组的旧元素保存在新数组中。我该如何解决这个问题?的主要内容,如果未能解决你的问题,请参考以下文章