2014-11-22 32 views
-2

你知道在C,我們可以初始化字符串變量是這樣的:執行特殊類型的字符串初始化的用C

char text[1024] = 
"Hello " 
"World"; 

但如果我有一個返回單詞「世界」的功能?

char text[1024] = 
"Hello " 
World(); 

在我看來,這是不可能在C. 請確認。

+10

不,這是不可能的。您只能使用此方法連接字符串文字。 – 2014-11-22 11:59:46

+0

@CoolGuy我需要它到初始化部分。問題已關閉。 – 2014-11-22 12:02:16

+0

@alk嗯什麼?你絕對可以... – 2014-11-22 12:02:36

回答

2

你想要什麼是不可能的。

Assigment操作符的L值需要可修改,而數組不是。

從C11-標準:

6.5.16/2

賦值操作員有修改的左值作爲它的左操作數。

char text[1024] = "Hello ""World"; 

從C11-標準:

的唯一例外此使用的文字作爲R值時初始化期間是

6.7.9/14

字符類型的數組可以通過字符串文字或UTF-8字符串 升al,可選地包含在大括號中。字符串文字的連續字節(包括 ,如果有空間或數組大小未知,則終止空字符)將初始化數組的元素 。

+0

答案已接受。 – 2014-11-24 10:01:44

1

如果World()的東西,總是返回 「世界」,然後把它定義爲一個宏:

#define World "World" 

然後執行:

char text[1024] = 
"Hello " 
World; //Without parentheses 

編輯

字符串連接在你期望的做法是由C預處理器完成的。你實際上是在尋找一個兩個字符串的運行時連接,其中c以多種方式執行。最簡單的一個是由strcat函數來實現,而應該由函數明確執行初始化:

char text[1024]; 
void init_text() { 
    strcpy(text, "Hello "); 
    strcat(text, World()); //World() defined somewhere else 
} 

使用sprintf備選:

void init_text() { 
    sprintf(text, "Hello %s", World()); 
} 

然後在main函數,調用init_text()開頭:

int main() { 
    init_text(); 
    ... 
} 
+0

有關如何使用返回char *初始化程序內部的World()函數的其他想法? – 2014-11-22 12:10:17

+0

我已經更新了我的答案。 – Claudix 2014-11-22 12:39:09

+0

只是爲了偏執,如何使用'strncat'和'snprintf'而不是它們的未綁定版本? – LSerni 2014-11-22 16:28:04

0

標準C中不可能用某些運行時特定的行爲來初始化某些東西。因此,標準的便攜式方法是通過調用main開頭的函數來初始化數據,如answered by Claudix。但是,如果您最近使用了一些GCC編譯器(或Clang/LLVM),那麼您可以在某些系統(包括Linux和其他POSIX系統)上使用某些constructor attribute on function。所以,你會宣稱:

static void init_text(void) __attribute__((constructor)); 

,並定義init_textClaudix's answer沒有不必調用它的main:因爲它具有constructor屬性,它會神奇地main之前,如果出現叫,或在dlopen(3)在一個動態鏈接的插件或庫中。

更便攜的技巧可能是讓函數返回該文本,以便在第一次調用期間對其進行初始化。因此,不要使用text,您可以撥打get_my_text()(可能通過將#define text get_my_text()放在標題中,但出於可讀性原因,我不建議這樣做,因此請將text的每次出現替換爲get_my_text() ...),並將其定義爲:

const char*get_my_text() { 
    static char textbuf[1024]; 
    if (textbuf[0]) { 
     // already initialized, so return it 
     return textbuf; 
    }; 
    snprintf(textbuf, sizeof(textbuf), "Hello %s", World()); 
    return textbuf; 
} 

當心,這樣的把戲是不可靠的多線程程序:兩個線程可能在同一時間正好運行get_my_text,和你有一個數據race。在多線程應用中,例如, pthread_once

您甚至可以在頭文件中將get_my_text定義爲static inline函數。

PS始終優先選擇snprintf(3)sprintf以避免buffer overflows。還要注意,在標準C++任何static或全球數據與一些給出constructormain之前進行初始化... GCC功能屬性故名...