我已经使用由数组组成的结构声明了我的头文件。它看起来像这样:
#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"
,以便我可以分别访问每个字母(A
,B
,C
)。有人能告诉我怎么能实现这个目标?
答案 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]