将struct字段转换为unsigned char字符串

时间:2014-03-17 12:01:50

标签: c struct

我在嵌入式系统上,因此无法访问大部分标准库。我有struct,其中包含char值。

我有一个简单的print函数,它只是将一个unsigned char字符串输出到附加的屏幕。它不支持printf之类的格式说明符。

这是结构:

typedef struct my_options{
    char test;
} my_options;

这就是我尝试输出值的地方:

 struct my_options options;
 print(options.test);  //Here I get "implicit conversion of int to ptr"

我如何实现这一目标?

4 个答案:

答案 0 :(得分:3)

创建一个char数组来保存你的char然后打印它:

char wrapper[2];
wrapper[0] = options.test;
wrapper[1] = '\0';
print(wrapper);

答案 1 :(得分:2)

创建一个临时的2个字符的长字符串,其中包含要打印的字符,然后是终结符。然后将该字符串传递给print()函数:

void print_options(const struct my_options *opt)
{
  char tmp[] = { opt->test, '\0' };
  print(tmp);
}

答案 2 :(得分:1)

您的成员test,如果类型charprint函数需要const char *类型的参数(假设此处const位,但这就是我所期待的,这是一个助手)。传递test的地址然后似乎就像适当的解决方案一样,但是它呢?

,当然不是。没有绝对保证test之后的下一个字节将是'\0'(字符串终止字符)。那么你应该做的是创建一个包装器字符串:

char char_wrapper[2] = {};//initializes according to standard
//but as Lundin pointed out, self-documenting code is important:
char_wrapper[0] = options.test;?
char_wrapper[1] = '\0';//explicit, so it's clear what this code does
print(char_wrapper);

这应该可以正常工作。
当然,你可以把它写成一行:

char char_wrapper[2] = {options.test, '\0'};//same as before, only in 1 statement
print(char_wrapper);//print "string"

应该这样做,真的。您甚至不必显式写入终止字符,因为标准特别指出:

  

字符串数组可以由字符串文字初始化,可选   用括号括起来。字符串文字的连续字符(包括   如果有空间或数组的大小未知,则终止空字符)初始化   数组的元素。

6.7.8初始化 cf p. 138, semantics, point 14

尽管如此,我仍然喜欢浏览网页,或者只是编写自己的printf次要实现,以便使用格式说明符。哎呀,这是K& R书中的第一个练习之一,网上有大量的解决方案。检查出来,并根据您的具体需求进行调整 或者,也许定义print接受size_t参数,以指定要传递给输出流的字符数。并称之为print(options.test, 1);

答案 3 :(得分:0)

print正在寻找char*。您传递的char也可以表示为int。因此,该函数试图将int隐式转换为指针,就像它告诉你的那样。

char ptr[2];
ptr[0] = options.test;
ptr[1] = '\0';

char包装到char数组中,当你将它传递给函数时,它会在C中衰减成指针。