C 每次迭代都会替换索引中的值
我已经创建了一个C程序,我应该在其中读取一个文本文件,并通过int和string指针将其分配给一个结构 以下是我的程序的代码片段: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;
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