C unsigned char字符串数组

时间:2012-09-15 12:11:08

标签: c arrays string

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

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

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

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}}
相关问题