C unsigned char字符串数组

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

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”的某些表示已经签名,但我不确定为什么/如何处理它.我想要一个字符串数组,其中每个字符串是一个无符号字符数组而不是有符号字符.有人可以帮忙吗?

注意:这是针对硬件问题,但不是实际问题,只是许多可能解决方案中的一小步.但是,如果你能帮助我理解它而不给我一个明确的答案,那将是件好事.谢谢.

最佳答案 C字符串是人们可以表示字符串的众多方式之一,由char数组组成,后者由尾随char终止,其值为null.当你的代码中有“0000”时,这就是你的类型.

你想要的是将“0000”指定为一个unsigned char数组,该数组由一个具有null值的尾随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风格字符串的大部分优点.使用unsigned char“string”,您没有任何标准字符串库可供使用,因此如果要使用printf或任何其他面向字符串的函数,则必须转换回已签名的char字符串类型.

实际上,您只为每个可能的字符位置“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 ...
点赞