1

我创建了一个 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 second third

这是输出:

//first iteration
first:first
second: <null>
third: <null>
//second
first:second
second: second
third: <null>
//third
first:third
second: third
third: third

顺便说一句,我将我的结构声明为:

typedef struct{
    int id;
    char *first_name;
    char *last_name;
    int phone_num;
} phone_det;

其中 phoneBook 在数据类型 phone_det 下声明。

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

4

6 回答 6

2

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

于 2013-06-30T04:28:19.857 回答
1

您的分配info[i].first_name指向而fname;不是声明fname为:(char* fname;正如我假设您所做的那样),请执行以下操作:char[MAX_SIZE] fname;然后使用strcpy复制该值。这样做:strcpy(info[i].first_name, fname);

于 2013-06-30T04:33:25.533 回答
1

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

于 2013-06-30T04:28:49.007 回答
0

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

fname实际上是一个缓冲区。(可能是一个 char fname[20])所以每个项目都指向fname每次读取时发生的变化。

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

于 2013-06-30T04:28:35.993 回答
0

您应该复制名称,而不是指向它。您正在将所有指针设置为您将姓氏读入的位置。使用strcpy或一些这样的。

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

fscanf(phoneBook, "%d|%s\n", &(info[i].phone_num), info[i].first_name);
于 2013-06-30T04:29:05.487 回答
0

每次迭代都会读入fname,然后将 的fname地址分配给info[i].first_namefname的地址在每次迭代之间都不会改变,因此您为所有first_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;

    ...
}
于 2013-06-30T04:29:08.840 回答