我的数组只保存C中存储的最后一个元素

我的数组只保存C中存储的最后一个元素,c,arrays,overwrite,C,Arrays,Overwrite,我想将从输入中获得的一些信息存储到特定的数组中。然而,当我尝试使用输入中的名称和姓氏时,我似乎遇到了一个问题,即输入的最后一个元素覆盖了前面的元素。这可能有什么问题?先谢谢你。。。代码如下: #include <stdio.h> #include <string.h> #include <stdlib.h> struct ask5 { char *onomata[1024],*epwnyma[1024]; int arithmoim[102

我想将从输入中获得的一些信息存储到特定的数组中。然而,当我尝试使用输入中的名称和姓氏时,我似乎遇到了一个问题,即输入的最后一个元素覆盖了前面的元素。这可能有什么问题?先谢谢你。。。代码如下:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

struct ask5  {
    char *onomata[1024],*epwnyma[1024];
    int arithmoim[1024];
    float bathmoi[1024];
};

int main(int argc, char *argv[]) {
    int x,i,tempi,l,reorder,k,j,u,y,p;
    struct ask5 *m = (struct ask5*)malloc(sizeof(struct ask5));
    char *xwrismos,input[1000][1024],*tempc,newstring[4][100],*eachstring;
    float q,tempf,avg;
    FILE * fptr;
    FILE *fexit;
    k=0;
    i=0;
    fptr=fopen("input.txt", "r");   
    while(fgets(input[i], 1024, fptr)) {
        input[i][strlen(input[i]) +1 ] = '\0';    \\im putting the input in specific arrays\\
        i++;
    }
    k=i;
    l=input[0][0] - '0';         \\first row of the input shows how many info will follow\\
    x=l;
    p=0;
    for (i=1; i<x+1; i++) {
        j=0;
        u=0;
        eachstring = input[i];
        for (y=0; y<=(strlen(eachstring)); y++) {
            if(eachstring[y]==' ' || eachstring[y]=='\0') {
                newstring[u][j]='\0';
                u++;
                j=0;
            }
            else {
                newstring[u][j]=eachstring[y];
                j++;
            }
        }
        m->onomata[p]=newstring[0];  \\here is the problem\\
        m->epwnyma[p]=newstring[1];  //and here//
        sscanf(newstring[2], "%d", &m->arithmoim[p]);
        sscanf(newstring[3], "%f", &m->bathmoi[p]);
        p=p+1;
    }
    fclose(fptr);
#包括
#包括
#包括
结构ask5{
char*onomata[1024],*epwnyma[1024];
整数算术[1024];
浮式bathmoi[1024];
};
int main(int argc,char*argv[]){
intx,i,tempi,l,reorder,k,j,u,y,p;
struct ask5*m=(struct ask5*)malloc(sizeof(struct ask5));
char*xrismos,输入[1000][1024],*tempc,新闻字符串[4][100],*每个字符串;
浮动q、温度、平均值;
文件*fptr;
文件*fexit;
k=0;
i=0;
fptr=fopen(“input.txt”,“r”);
而(fgets(输入[i],1024,fptr)){
输入[i][strlen(输入[i])+1]='\0';\\i正在将输入放入特定数组中\\
i++;
}
k=i;
l=输入[0][0]-“0”;\\n输入的第一行显示后面有多少信息\\
x=l;
p=0;
对于(i=1;iepwnyma[p]=newstring[1];//这里//
sscanf(newstring[2],%d“,&m->arithmoim[p]);
sscanf(新闻字符串[3],%f“,&m->bathmoi[p]);
p=p+1;
}
fclose(fptr);
确实存在问题。因为您使每个
m->onomata[p]
指向相同的
newstring[0]
。对于
newstring[1]
也是如此

您可能想复制一份
newstring
s,以便在下一次迭代中重用它们。您可以使用
strdup

    m->onomata[p]=strdup(newstring[0]);
    m->epwnyma[p]=strdup(newstring[1]);

input[i][strlen(input[i])+1]='\0';
不需要,因为
fgets
已经终止了输入。
onomata
是一个包含1024个元素的数组,每个元素都是一个指针。不确定这是你想要的…@PaulOgilvie是的,但是我没有问题。。问题更进一步!
m->onomata[p]=newstring[0];
不复制
newstring[0]
@pmg我已将大小设置为1024,因为大小未知..我想要的是newstring[0],它在每次循环后都不同于m->onomata[p]然而,每一次,虽然在第一次循环后,新的数字可以覆盖以前的数字。例如,如果第一次新闻字符串[0]是'sas'm->onomata[0]将是'sas'。在第二次循环中,新闻字符串[0]将是'ssssss',因此m->onomata[1]将是'ssssss',但m->onomata[0]也将是'ssss'我试过了,错误赋值使指针从整数开始,没有强制转换。我是C语言的新手,我不知道我该怎么做。有什么见解吗?
    m->onomata[p]=strdup(newstring[0]);
    m->epwnyma[p]=strdup(newstring[1]);