簡體   English   中英

C macro:將數字轉換為字符串

[英]C macro : turn a number into a string

我有一個表格,用於在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" AT COMPILE TIME,以便我可以在R / O部分中輸入字符串?

飛思卡爾HC08 C編譯器。

您可以在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;

UPDATE

如果您可以使符號的值與符號表中的位置匹配(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;
}

編輯(SO不喜歡我的瀏覽器)

宏擴展后, SYMBOL_NUM(32)轉換為整數文字( 0x78 ); SYMBOL_STR(78)轉換為字符串文字( "\\x78" )。

您可以像使用鍵入文字一樣使用文字。

const char *test = "Next" SYMBOL_STR(78) " one";
/* same as
   const char *test = "Next\x78 one";
*/

我想出了這個小程序:

#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 ...

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM