我的数组只保存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]);