Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.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_Recursion_Struct - Fatal编程技术网

C 如何使用递归访问结构的某些元素

C 如何使用递归访问结构的某些元素,c,arrays,recursion,struct,C,Arrays,Recursion,Struct,我将编写一个函数,详细说明一个结构并返回字符数组的长度,即以递归方式在同一个结构中定义。 结构是: typedef struct BinSeq { char* data; int dimension; }BinSeq typedef struct BinSeq { char* data; int dimension; }BinSeq 数据(字符数组)只能有两种类型的字符:“0”和“1”,而维度是数组的

我将编写一个函数,详细说明一个结构并返回字符数组的长度,即以递归方式在同一个结构中定义。 结构是:

typedef struct BinSeq {
char* data;              
int dimension;         
}BinSeq
typedef struct BinSeq {
char* data;              
int dimension;         
}BinSeq
数据(字符数组)只能有两种类型的字符:“0”和“1”,而维度是数组的长度,但不是“0”和“1”的序列。 所以我试着写这个函数:

int length(BinSeq* bin_seq) {
   int i;
   if(bin_seq->data[i] == '0' || bin_seq->data[i] == '1')
   {
         i++;
         return 1 + length(bin_seq->data[i]);
    }else
             return 0;
}
但我可能对此有所怀疑。第一个原因是编译器说:

warning: passing argument 1 of ‘length’ makes pointer from integer without a cast [enabled by default]
              return 1 + length(bin_seq->data[i]);
              ^
recursion.c:13:6: note: expected ‘struct BinSeq *’ but argument is of type ‘char’
  int length(BinSeq* bin_seq) {

如果我必须将Binseq*bin_seq传递给我的函数,我如何处理数据?我知道我的代码在这方面是错误的,但是如果我想计算leght,我必须增加变量I,但我认为它不会增加。如何处理此问题?

如果我的解释正确,此代码应能满足您的要求:

int length(BinSeq* bin_seq, int i) {
   if(bin_seq->data[i] == '0' || bin_seq->data[i] == '1')
   {
         return 1 + length(bin_seq->data, ++i);
   } else {
         return 0;
   }
}

尽管有更有效的编码方法:实际上,您可以简单地使用指针算法在
char
数组上循环,直到找到除0或1以外的任何值。您还没有显示如何初始化序列;我们可以假设它是使用已知的终止符字符(例如,
\0
)正确完成的。

我必须编写一个函数int length(BinSeq*bin_seq),递归计算二进制序列bin_seq的长度。结构是:

typedef struct BinSeq {
char* data;              
int dimension;         
}BinSeq
typedef struct BinSeq {
char* data;              
int dimension;         
}BinSeq
主要是:

   int main(int argc, char** argv) {  
       Binseq* binary;
       binary.data  = "0000110111";
       binary.dimension = 2014;
       int dimension_of_array = length(BinSeq* bin_seq);
   }
如果必须将bin_seq传递给函数,如何计算数据长度?

如下所示:

#include <stdio.h>

typedef struct BinSeq {
    char *data;
    int dimension;
} BinSeq;

int length(BinSeq* bin_seq) {
    if(*bin_seq->data == '0' || *bin_seq->data == '1')
         return 1 + length(&(BinSeq){bin_seq->data + 1, bin_seq->dimension});

    return 0;
}

int main(int argc, char** argv) {  
    BinSeq binary;

    binary.data  = "0000110111";
    binary.dimension = 2014;

    int dimension_of_array = length(&binary);

    printf("%d\n", dimension_of_array);

    return 0;
}

您使用未初始化变量的值调用了未定义的行为,该变量具有不确定的自动存储持续时间
i
。很抱歉,我无法清楚地获取您想要的内容
BinSeq
似乎没有指向下一个节点的指针。@MikeCat如果必须传递到函数bin_seq,即BinSeq类型,我如何处理数组数据?在
结构中没有递归,编译器应该警告该代码。正如许多初学者所认为的那样,它们是不容忽视的。你的问题不清楚。很抱歉,如果我以一种不好的方式暴露了这个问题,我必须在那里做一些经验。我必须用这个协议编写这个函数:int lengh(BinSeq*bin_seq)。可能我不得不重新表述我的问题,不清楚。这样的递归非常浪费。因此,首先我必须记住,我正在使用由我创建的Binseq类型的指针。然后要在Binseq中“输入”,我必须使用您在那里使用的Sintax&(BinSeq){bin_seq->data+1,bin_seq->dimension}?或者我可以用另一种方法吗?@MicheleColuccelli您可以使用局部变量而不是
&(BinSeq){bin_-seq->data+1,bin_-seq->dimension}
。例如
BinSeq温度;temp.data=bin_seq->data+1;温度尺寸=料仓顺序->尺寸<代码>返回1+长度和温度尺寸实际上不需要。因为它不使用。你应该编辑你的问题,而不是在“答案”中问另一个问题,主要是因为其他人很难跟上对话。我将编辑我的答案,以解决这一澄清。