【问题标题】:Accessing string from a structure, by using a series of pointers通过使用一系列指针从结构中访问字符串
【发布时间】:2018-07-14 00:23:35
【问题描述】:
typedef struct {
    char numeVolum[50]; ////this is what interests us!!!
    short int anPublicare; 
    unsigned char stare; 
    int idPersoana; 
} TVolum; 

typedef struct { 
    char numeAutor[50];  
    char codTara[2];  
    int nrVolume; 
    TVolum* volume;  /////this is what interests us!!!
} TAutor; 

这两个结构都是动态分配的! listaAutori[0] 是一个指向 TAutor 结构的指针数组! (可以断定listaAutori是一个TAutor**类型)

fgets(listaAutori[0] -> numeAutor, 50, input); 
fgets(listaAutori[0] -> codTara, 3, input); 
fgets(listaAutori[0] -> volume[0].numeVolum, 53, input); 

前两个 fget 读取良好。 但是第三个没有给我任何输出。

printf("\nNUme primul volum al lui Agatha: %s\n", listaAutori[0] -> volume[0].numeVolum);

换句话说,我有两个结构,A 和 B。 在 B 里面,我有一个字符串。 (指向字符的指针)

结构A中有一个指针pB。 还有一个指向 A 的指针数组。

像这样:

包含 pA 元素的指针数组 -> 结构 A -> pB -> 结构 B -> 我的字符串。

我正在尝试从文件中读取一行,并将该字符串存储在 numeVolum[50] 字符串中。我可以访问 TVolum 的唯一方法是使用指向 TAutor 的指针。

我不知道什么不起作用,printf 没有给我任何输出。 它应该打印一些东西。 (我从中读取数据的文件包含每一行的信息)

Autor* alocaAutor(int nrVolume) 
{ 
    TAutor* autor = (TAutor*)calloc(1, sizeof(TAutor));  
    autor -> volume = (TVolum*)calloc(nrVolume, sizeof(TVolum)); 
    autor -> nrVolume = nrVolume; 
    return autor; 
} 

TAutor** alocaAutori(int nrAutori, int* nrVolumeAutor) 
{
    int i;
    TAutor** vectorAutori = (TAutor**)calloc(nrAutori, sizeof(TAutor*));  
    for(i = 0; i < nrAutori; i++) {
        vectorAutori[i] = alocaAutor(nrVolumeAutor[i]); 
    } 
    return vectorAutori; 
} 

输入文件示例:

2 
1 
1
Agatha Christie
UK
Ultimul caz al lui Hercule Poirot

我 100% 肯定它会读取最后一行之前的所有内容。 然后,当我尝试从 TVVolume 读取字符串中的最后一行时,它根本不起作用。

【问题讨论】:

  • 您在哪里以及如何初始化卷指针?还尝试将最多 53 个字符读入字符串 [50] 可能会发生溢出
  • 初始化 TAutor* 后,我还初始化了它的音量指针。
  • 那 53 是随机的,反正我正在读的字符串小于 25。
  • 我不确定这一行是否正确: fgets(listaAutori[0] -> volume[0].numeVolum, 53, input);它似乎很长,我以前从未这样做过
  • 您应该添加该代码。也可能是输入文件的示例。

标签: c arrays pointers structure


【解决方案1】:
char *fgets(char *str, int n, FILE *stream)

在读取n-1 字符时停止 (source)。因为第二个fgetsn 的值是3,所以它只读取输入文件中的UK。它后面的换行符还没有被读取。然后它被 third fgets 读取,它立即遇到换行符,不会进一步读取。因此,不会读取输入文件中的最后一行。

您编辑的代码(在您的评论中)有效,因为 fscanf 读取该换行符并停在它处,留下 fgets 读取最后一行。

【讨论】:

  • 您应该将codTara 数组的大小增加到3。在当前状态下,您的代码可能会表现出未定义的行为,因为fgets 在它读取的字符之后附加了一个空终止符(给定您的输入文件,它会将终止符放在codTara + 2,它位于未分配的内存中)。跨度>
  • 谢谢兄弟',这就是我一直在寻找的答案。这一切都说得通。在我的内心深处我知道这一点,但我昨晚太累了,无法组装这个拼图的碎片。
猜你喜欢
  • 1970-01-01
  • 2021-12-11
  • 1970-01-01
  • 2011-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多