2013-06-19 51 views
2

是否可以將任何類型的任何變量轉換爲字符串?將任何變量轉換爲C中的字符串

我寫了下面

#define TO_STRING(val) #val

這是一個變量轉換成字符串的有效方法是什麼?

+3

好吧,我是一個說這句話的,所以我會表現爲挑剔的一個:有在C. – user2485710

+4

沒有串@ user2485710這是一個很奇怪的說法。 – unwind

回答

2

我認爲下面的代碼會做你的工作。我使用標準sprintf函數,該函數將任何類型的數據打印到字符串中,而不是stdout。代碼:

#include <stdio.h> 

#define INT_FORMAT "%d" 
#define FLOAT_FORMAT "%f" 
#define DOUBLE_FORMAT "%lf" 
#define LL_FORMAT "%lld" 
// ect ... 

#define CONVERT_TO_STRING(FORMAT, VARIABLE, LOCATION) \ 
    do { \ 
    sprintf(LOCATION, FORMAT, VARIABLE); \ 
    } while(false) 

int main() { 
    char from_int[30]; 
    char from_float[30]; 
    char from_double[30]; 
    char from_ll[30]; 

    CONVERT_TO_STRING(INT_FORMAT, 34, from_int); 
    CONVERT_TO_STRING(FLOAT_FORMAT, 34.234, from_float); 
    CONVERT_TO_STRING(DOUBLE_FORMAT, 3.14159265, from_double); 
    CONVERT_TO_STRING(LL_FORMAT, 9093042143018LL, from_ll); 

    puts(from_int); 
    puts(from_float); 
    puts(from_double); 
    puts(from_ll); 

    return 0; 
} 
+0

我無法得到這個原因? {\ sprintf(LOCATION,FORMAT,VARIABLE); \ } while(false) – user2407394

+1

@ user2407394只是爲了安全:) –

+0

建議'%e'而不是'%f'。比較'printf(「%e%f \ n」,1.23e-8,1.23e-8); printf(「%e%f \ n」,1.23e + 50,1.23e + 50);''1.230000e-08 0.000000'' 1.230000e + 50 22999999999999994846185700645503654167417200000000.000000' – chux

3

您將獲得變量的名稱的字符串版本,即它將將a轉換爲"a"。當這樣使用時,#被稱爲stringification operator

例如:

#define TO_STRING(val) #val 

int main(void) 
{ 
    const int a = 12; 
    print("a is %s\n", TO_STRING(a)); 
    return 0; 
} 

這將打印a is a

你預計會發生什麼?

當然,當預處理器運行時(編譯時),該變量不可用,因此無法獲得變量的

3

試試這個將使用整數:編輯其他數據類型的格式字符串。

sprintf(str,"%d",value);