如何遍历头文件中声明的数组?

时间:2015-08-03 13:29:01

标签: c arrays pointers

我已经使用由数组组成的结构声明了我的头文件。它看起来像这样:

 #ifndef HEADER_H_
 #define HEADER_H_

  typedef struct{
     uint32_t State[3];
     }h_t;

 #endif

访问此头文件的C文件如下所示:

  #include"Header.h"
  #include<stdio.h>
  #include <stdlib.h>

  char* old_states[3];


  old_states[0] ="ABC";
  old_states[1] ="BAC";
  old_states[2] ="AAC";

  h_t var;
  for(i=0; i<3;i++){
    var.State[i] = old_states[i];
    printf("\n The state is %s", var.State[i]);
     }

我打印状态以检查它们。它们是:

The state is ABC
The state is BAC
The state is AAC

现在,我想循环遍历每个var.State[n],例如var.State[0]var.State[1]var.State[2]

这是循环var.State[0] ="ABC",以便我可以分别访问每个字母(ABC)。有人能告诉我怎么能实现这个目标?

2 个答案:

答案 0 :(得分:4)

在您的代码中,old_states[n]char *,是指针。 OTOH var.State[i]的类型为uint32_t,它们不相同。

指针类型可能转换为整数类型,但结果严格依赖于实现。更进一步,如C11中所述,章节§6.3.2.3,

  

如果结果无法以整数类型表示,则行为未定义。

所以,基本上你应该避免这样做,除非你真的知道你在做什么。

然后,在

的情况下
 printf("\n The state is %s", var.State[i])

%s期望char *指向字符类型数组的初始元素的指针),确切地说,如果未指定精度,则为应该以null结尾),但你传递的是uint32_t。根据上述观点,它再次被称为undefined behaviour

故事的道德:启用编译器警告并注意他们

解决方案:

最好从

更改您的结构成员类型
 uint32_t State[3];

char * State[3];

然后,按照您现在的操作分配它们,最后,为了访问所有个别元素,您可以执行类似(伪代码

的操作
 for(i=0; i<3;i++)
 {
      int len = strlen(var.State[i]);

      for(j=0; j < len ;j++) printf("%c \t", var.State[i][j]);
      printf("\n");
 }

答案 1 :(得分:0)

当您声明double angle = 18; public void saveToPNG(Image image, String name) throws IOException { File f = new File (name + ".png"); try { ImageIO.write((RenderedImage) image, "png", f); } catch (IOException e) { e.printStackTrace(); } 并使用uint32_t State[3];说明符打印它时会产生问题。

您可以将%s声明为像这样的二维字符数组 -

修改

State[3];

存储值 -

char State[3][4];

并像这样访问每个角色 -

for(i=0;i<3;i++)
 {
    memcpy(var.State[i],old_states[i],strlen(old_states[i]);
 }

打印每个角色

var.State[i][j]