我在嵌入式系统上,因此无法访问大部分标准库。我有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"
我如何实现这一目标?
答案 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
,如果类型char
,print
函数需要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中衰减成指针。