int * vector只接受第一个给定值

时间:2014-03-31 23:31:05

标签: c vector struct

我在用C编写的代码中遇到了一些麻烦。这是关于int *向量的最终声明和动态分配但是当它填充数据时它会停留在第一个元素上并且不会增加计数器填写矢量的其余部分

我的头文件:instance.h

struct pbCoupe
{
   int tailleBarre; 
   int nbTaillesDem; 
   int nbTotPcs;
   int * taille; 
int * nbDem; 
};

我的代码:coupe.c

pb->taille = (int*) malloc (pb->nbTaillesDem * sizeof(int)); 
pb->nbDem = (int*) malloc (pb->nbTaillesDem * sizeof(int));


while (i < pb->nbTaillesDem)
{
    fscanf_s(instanceFile,"%s",data,sizeof(data)); 
    pb->taille[i] = atoi(data); //<-- here is the problem !! it only accept the first value and ignore all the rest 

    printf("%s\n",data);

    fscanf_s(instanceFile,"%s",data,sizeof(data)); 
    pb->nbDem[i] = atoi(data); //<-- the same problem here too !!
    printf("%s\n",data);

    i++;
}

1 个答案:

答案 0 :(得分:-1)

您对sizeof的解释是错误的,因为data是解析字符串的缓冲区。

它返回变量的大小,而不是变量(或指针)指向的大小

C中的字符串都是指向大小的指针,在32位系统上是4个字节,在64位上是8个。

因为它打印所有数字,所以读取更多数字,每个循环迭代4个字节= 4个字符,atoi on解析第一个整数并返回,

编辑:如果是缓冲区数组,sizeof将返回数组的大小。

您需要确保每次迭代循环只读取一个数字才能解决此问题。

如果你不关心文字字符串,你可以做的最好的事情就是:

fscanf(instanceFile, "%d", ((pb->taille) + i)));
//and store the integer into the index right away
//last param same as &pb->taille[i]