Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 每次迭代都会替换索引中的值_C_Arrays_Pointers_Scanf - Fatal编程技术网

C 每次迭代都会替换索引中的值

C 每次迭代都会替换索引中的值,c,arrays,pointers,scanf,C,Arrays,Pointers,Scanf,我已经创建了一个C程序,我应该在其中读取一个文本文件,并通过int和string指针将其分配给一个结构 以下是我的程序的代码片段: i = 0; while(!feof(phoneBook)) { fscanf(phoneBook, "%d|%s\n", &num, fname); info[i].phone_num = num; printf("%d\n", info[i].phone_num); info[i].first_name = fname;

我已经创建了一个C程序,我应该在其中读取一个文本文件,并通过int和string指针将其分配给一个结构

以下是我的程序的代码片段:

i = 0;
while(!feof(phoneBook)) {
    fscanf(phoneBook, "%d|%s\n", &num, fname);
    info[i].phone_num = num;
    printf("%d\n", info[i].phone_num);
    info[i].first_name = fname;
    printf("%s\n", info[i].first_name);

    i++;
    ctr++; 
    printf("\nfirst:%s", info[0].first_name); 
    printf("\nsecond:%s", info[1].first_name);
    printf("\nthird:%s\n\n", info[2].first_name);       
}
在第一次迭代中,它将第一行分配给info的0索引。 对于第二次迭代,它将第二行指定给索引1并替换索引0

文本文件仅包含以下行(用于测试目的): 第一 第二 第三

以下是输出:

//first iteration
first:first
second: <null>
third: <null>
//second
first:second
second: second
third: <null>
//third
first:third
second: third
third: third
其中phoneBook是在数据类型phone_det下声明的


任何形式的帮助都将不胜感激!我刚开始使用C,但我仍然会对指针感到困惑(

虽然我们看不到您的结构,但您每次都将指针分配给相同的名称缓冲区,并且不将名称缓冲区本身复制到特定的数组中,因此最终会有许多不同的指针指向相同的名称缓冲区。

虽然我们看不到您的结构,但您将指针分配给相同的n每次使用ame缓冲区,并且不将名称缓冲区本身复制到特定数组,因此最终会有许多不同的指针指向同一名称缓冲区。

这是一个猜测,因为我看不到所有代码,但我打赌这些项只有char*,也就是说,您正在将指针分配给字符串

fname
实际上是一个缓冲区。(可能是一个字符fname[20]),因此每个项目都指向
fname
,它随每次读取而变化


若要解决此问题,请使结构包含一个数组。然后使用
strcpy
strncpy
从fname复制它。

这是一个猜测,因为我看不到您的所有代码,但我打赌这些项目只有char*,也就是说,您正在将指针分配给字符串

fname
实际上是一个缓冲区。(可能是一个字符fname[20]),因此每个项目都指向
fname
,它随每次读取而变化


要解决此问题,请使结构包含一个数组。然后使用
strcpy
strncpy
从fname复制它。

问题是赋值
info[i]。first\u name=fname;
。这不会复制字符串-它只是设置
info[i].first_name
指向
fname
指向的同一内存。因此,每次迭代后,它们都指向
fname
指向的同一内存。因此,当
fscanf
将新值放入缓冲区时,所有结构都会看到新内容。

问题在于赋值
info[i].first_name=fname;
。这不会复制字符串-它只是设置
info[i].first_name
指向
fname
指向的同一内存。因此,每次迭代后,它们都指向
fname
指向的同一内存。因此,当
fscanf
将新值放入缓冲区时,所有结构都会看到新内容。

您应该复制名称,而不是指向它。您已经设置好了将所有指针指向读取姓氏的位置。使用
strcpy
或类似方法

或者,为了让生活更简单,请确保为
first_name
元素分配了足够的空间,然后使用

fscanf(phoneBook, "%d|%s\n", &(info[i].phone_num), info[i].first_name);

您应该复制名称,而不是指向它。您正在将所有指针设置为读取姓氏的位置。请使用
strcpy
或类似的方法

或者,为了让生活更简单,请确保为
first_name
元素分配了足够的空间,然后使用

fscanf(phoneBook, "%d|%s\n", &(info[i].phone_num), info[i].first_name);

每次迭代读入
fname
,然后将的
fname
的地址分配给
info[i]。first\u name
fname
的地址在每次迭代之间不会改变,因此您将相同的地址分配给所有
first\u name
指针

您需要为每个迭代分配一个唯一的数组,以便字符串存储在不同的位置,而不是每一个都覆盖最后一个

while(!feof(phoneBook)) {
    char *fname = malloc(SUITABLY_LARGE_SIZE);

    if (fname == NULL) {
        perror("malloc");
        exit(1);
    }

    fscanf(phoneBook, "%d|%s\n", &num, fname);
    info[i].first_name = fname;

    ...
}

每次迭代读入
fname
,然后将的
fname
的地址分配给
info[i]。first\u name
fname
的地址在每次迭代之间不会改变,因此您将相同的地址分配给所有
first\u name
指针

您需要为每个迭代分配一个唯一的数组,以便字符串存储在不同的位置,而不是每一个都覆盖最后一个

while(!feof(phoneBook)) {
    char *fname = malloc(SUITABLY_LARGE_SIZE);

    if (fname == NULL) {
        perror("malloc");
        exit(1);
    }

    fscanf(phoneBook, "%d|%s\n", &num, fname);
    info[i].first_name = fname;

    ...
}

您的赋值
info[i]。首先\u name
指向
fname;
而不是将
fname
声明为:
char*fname;
(我假设您这样做了),执行以下操作:
char[MAX\u SIZE]fname;
然后使用
strcpy
复制该值。也可以执行:
strcpy(info[i]。first\u name,fname)

您的赋值
info[i]。首先指定
name
指向
fname;
,而不是将
fname
声明为:
char*fname;
(我假设您这样做了),执行以下操作:
char[MAX\u SIZE]fname;
,然后使用
strcpy
复制值。也可以这样做:
strcpy(info[i].first_name,fname);

您的信息结构是什么样子的?它是如何声明的?不要这样使用
feof()
;它会给您错误的答案。更具体地说,您必须检查
fscanf()
中的值,因为它会在
feof()之前告诉您EOF
can.更新您的问题;不要将结构添加为注释。谢谢大家!终于实现了指针字符串数组的全部功能。现在一切正常。非常感谢!!!!!!!:)您的信息结构是什么样子的?它是如何声明的?不要像那样使用feof()
;它给了你错误的答案。更具体地说,您必须检查
fscanf()
中的值,因为它将在
feof()
可以更新您的问题之前告诉您有关EOF的信息;不要添加str