4

我有一个这样的字符串数组

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"};

我收到错误“使用 'char[5]' 类型的表达式初始化 'unsigned char *' 在指向具有不同符号的整数类型的指针之间转换。” 我猜这意味着正在使用的“0”和“1”的一些表示已签名,但我不确定为什么/如何处理它。我想要一个字符串数组,其中每个字符串都是一个无符号字符数组,而不是有符号字符数组。有人可以帮忙吗?

注意:这是针对硬件问题,但不是实际问题,只是许多可能解决方案之一中的一小步。但是,如果您能在不给我明确答案的情况下帮助我理解它,那就太好了。谢谢。

4

1 回答 1

4

C 字符串是表示字符串的多种方式之一,由具有值char的尾随终止的数组组成。当你的代码中有“0000”时,这就是你得到的类型。charnull

您想要的是将“0000”分配为由具有空值unsigned char的尾随终止的数组。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 }
              };

我看到这种方法的主要问题是它首先消除了拥有 C 样式字符串的大部分优势。使用无符号字符“字符串”,您没有任何标准字符串库可供您使用,因此如果您想使用,则必须转换回有符号字符字符串类型printf,或任何其他面向字符串的函数。

实际上,您只为每个可能的字符位置“0”和“1”使用了两个值。除非有令人信服的理由在字符串中执行此操作,否则请考虑使用布尔值数组来减少像“0hello”这样的字符串进入代码的机会,或者更好的是,如果您已经了解了位字段,请使用unsigned char 中的位作为位字段(丢弃您正在处理字符串的任何概念)。

最后一种技术的优点包括使用较少的内存,并且该值不能为 0 或 1 以外的值;但是,您必须编写一小部分例程来将打包的位转换为人类可读的内容。

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 ...
于 2012-09-15T12:33:48.710 回答