代码之家  ›  专栏  ›  技术社区  ›  THX-1138

C宏:将数字转换为字符串

  •  6
  • THX-1138  · 技术社区  · 15 年前

    我有一个表定义了5x7点显示器上的符号外观。类似:

    extern UINT8 symbols[][5] = {
        {0x0,0x0,0x0,0x0,0x0},
        {0x0,0x0,0x5F,0x0,0x0},
        {0x0,0x7,0x0,0x7,0x0},
        {0x14,0x7F,0x14,0x7F,0x14}, // etc.
    

    表的前导部分与ASCII表匹配,后面是一组特殊符号,例如箭头或复选标记。要引用这些宏,我有一个宏列表:

    #define SYMBOL_LEFT_ARROW 120 // 120 is the entry in the table
    #define SYMBOL_RIGHT_ARROW (SYMBOL_LEFT_ARROW+1)    
    #define SYMBOL_UP_ARROW (SYMBOL_RIGHT_ARROW+1)
    

    现在我要说的是(不会编译):

    const char * const message = "Next" + SYMBOL_RIGHT_ARROW;
    

    问题: 我怎么转身 SYMBOL_RIGHT_ARROW “x79”或整个字符串转换为 "Next\x79" 编译时 所以我可以把字符串放在R/O部分?

    飞思卡尔HC08 C编译器。

    3 回复  |  直到 10 年前
        1
  •  13
  •   pmg    15 年前

    可以在C源中连接字符串:

    printf("%s\n", "forty" "two"); /* prints "fortytwo" */
    /* NOTE:             ^^^ no punctuation */
    

    用你的符号来做这件事是一件很重要的工作,但也许你可以接受。

    #define SYMBOL_LEFT_ARROW 120
    #define SYMBOL_LEFT_ARROW_STR "\x79"
    #define SYMBOL_RIGHT_ARROW (SYMBOL_LEFT_ARROW + 1)
    #define SYMBOL_RIGHT_ARROW_STR "\x83"
    const char * const message = "Next" SYMBOL_RIGHT_ARROW_STR;
    

    更新

    如果可以使符号的值与其在符号表中的位置相匹配(120匹配“\x78”),请尝试以下宏

    #include <stdio.h>
    
    #define ADD_ZERO_X(y) 0x ## y
    #define SYMBOL_NUM(x) ADD_ZERO_X(x)
    
    #define STRINGIZE(z) #z
    #define ADD_SLASH_X(y) STRINGIZE(\x ## y)
    #define SYMBOL_STR(x) ADD_SLASH_X(x)
    
    #define SYMBOL_LEFT_ARROW 78 /* must write in hexadecimal without any prefix */
    #define SYMBOL_RIGHT_ARROW 79
    #define SYMBOL_UP_ARROW 7a
    
    int main(void) {
      printf("%d\n", SYMBOL_NUM(SYMBOL_LEFT_ARROW));
      printf("%s\n", SYMBOL_STR(SYMBOL_LEFT_ARROW));
      printf("%d\n", SYMBOL_NUM(SYMBOL_RIGHT_ARROW));
      printf("%s\n", SYMBOL_STR(SYMBOL_RIGHT_ARROW));
      printf("%d\n", SYMBOL_NUM(SYMBOL_UP_ARROW));
      printf("%s\n", SYMBOL_STR(SYMBOL_UP_ARROW));
      return 0;
    }
    

    编辑 (所以不喜欢我的浏览器)

    宏扩展后 SYMBOL_NUM(32) 转换为整型文本( 0x78 ;及 SYMBOL_STR(78) 转换为字符串文本( "\x78" )

    您可以像输入文字一样使用这些文字。

    const char *test = "Next" SYMBOL_STR(78) " one";
    /* same as
       const char *test = "Next\x78 one";
    */
    
        2
  •  3
  •   steve alexander    15 年前

    我想出了这个小程序:

    #include <stdio.h>
    
    #define TEST_CHR '\x77'
    #define VAL(x) #x
    #define STRINGIFY(x) VAL(x)
    int main()
    {
       int x = TEST_CHR;
       char *yyy = "%d " STRINGIFY(TEST_CHR) "\n";
    
       printf(yyy,x);
    
       return 0;
    
    }
    

    宏中的间接寻址是必要的,这样您的字符就可以在“”将其转换为字符串之前进行扩展。请注意,当您以这种方式使用'\x77'值时,它会变成一个有效的int…

        3
  •  2
  •   THX-1138    15 年前

    这是我能想到的最好的,不是完美的,但可以放在ROM中:

    const char message[] = {'N','e','x','t',SYMBOL_RIGHT_ARROW,EOS};