我有一个像这样的字符串数组
char *T[] = {"0000", "0001", "0010", "0011", "0100", "0101", "0110", "0111", "1000", "1001", "1010", "1011", "1100", "1101", "1110", "1111"};
但是当我这样做时,每个字符串都是一个无符号字符数组
unsigned char *T[] = {"0000", "0001", "0010", "0011", "0100", "0101", "0110", "0111", "1000", "1001", "1010", "1011", "1100", "1101", "1110", "1111"};
我得到错误“初始化'unsigned char *',其表达式为'char [5]',指针转换为具有不同符号的整数类型。”我猜这意味着正在使用的“0”和“1”的某些表示已经签名,但我不确定为什么/如何处理它。我想要一个字符串数组,其中每个字符串是一个无符号字符数组而不是有符号字符。有人可以帮忙吗?
注意:这是针对硬件问题,但不是实际问题,只是许多可能解决方案中的一小步。但是,如果你能帮助我理解它而不给我一个明确的答案,那将是件好事。感谢。
答案 0 :(得分:2)
C字符串是人们可以表示字符串的众多方式之一,由char
的数组组成,后缀为char
,其null
值为unsigned char
。当你的代码中有“0000”时,这就是你的类型。
你想要的是将“0000”指定为由unsigned char
终止的unsigned char T[][] = { { 0x30, 0x30, 0x30, 0x30, 0x00 },
{ 0x30, 0x30, 0x30, 0x31, 0x00 },
{ 0x30, 0x30, 0x31, 0x30, 0x00 },
{ 0x30, 0x30, 0x31, 0x31, 0x00 },
{ 0x30, 0x31, 0x30, 0x30, 0x00 },
{ 0x30, 0x31, 0x30, 0x31, 0x00 },
{ 0x30, 0x31, 0x31, 0x30, 0x00 },
{ 0x30, 0x31, 0x31, 0x31, 0x00 },
{ 0x31, 0x30, 0x30, 0x30, 0x00 },
{ 0x31, 0x30, 0x30, 0x31, 0x00 },
{ 0x31, 0x30, 0x31, 0x30, 0x00 },
{ 0x31, 0x30, 0x31, 0x31, 0x00 },
{ 0x31, 0x31, 0x30, 0x30, 0x00 },
{ 0x31, 0x31, 0x30, 0x31, 0x00 },
{ 0x31, 0x31, 0x31, 0x30, 0x00 },
{ 0x31, 0x31, 0x31, 0x31, 0x00 }
};
数组,该数组具有空值。考虑到你的开始,你必须以不需要投射的方式投射或者代表你的初始数据。
printf
我用这种方法看到的主要问题是它首先消除了拥有C风格字符串的大部分优点。使用unsigned char“string”,您没有任何标准字符串库可供使用,因此如果要使用unsigned char[] = { 0x00, 0x01, 0x02, 0x03, 0x04,
0x05, 0x06, 0x07, 0x08, 0x09,
0x0A, 0x0B, 0x0C, 0x0D, 0x0E,
0x0F };
void displayChar(unsigned char value) {
switch (value) {
case 0x00: printf("0000"); break;
case 0x01: printf("0001"); break;
case 0x02: printf("0010"); break;
case 0x03: printf("0011"); break;
... and so on ...
或任何其他面向字符串的函数,则必须转换回已签名的char字符串类型。
实际上,您只为每个可能的字符位置“0”和“1”使用两个值。除非有令人信服的理由在字符串中进行,否则请考虑一个布尔值数组,以减少像“0hello”这样的字符串在代码中工作的机会,或者更好如果你有已被引入位域,使用无符号字符内的位作为位字段(丢弃您处理字符串的任何概念)。
最后一种技术的优点包括使用更少的内存和无法使值不是0或1;但是,您必须编写一小组例程来将打包的位转换为人类可读的内容。
{{1}}