2012-11-10 26 views
5

,我有以下的代碼塊我使用的是德國動詞演練:動態代碼用C

if (strcmp(*option, "sein") == 0) 
    *option = linie.sein; 

if (strcmp(*option, "haben") == 0) 
    *option = linie.haben; 

if (strcmp(*option, "possessiv") == 0) 
    *option = linie.possessiv; 

if (strcmp(*option, "reflexiv") == 0) 
    *option = linie.reflexiv; 

if (strcmp(*option, "accusativ") == 0) 
    *option = linie.accusativ; 

if (strcmp(*option, "dativ") == 0) 
    *option = linie.dativ; 

但是我想它凝結成類似:

*option = linie.(*option); 

或許:

*option = linie.(*option)(); 

不幸的是,這些工作都沒有。有任何想法嗎?

編輯@dasblinkenlight:

typedef struct 
{ 
    char subjekt[20]; 
    char sein[20]; 
    char haben[20]; 
    char possessiv[20]; 
    char reflexiv[20]; 
    char accusativ[20]; 
    char dativ[20]; 
} satz; 

satz linie = 
{ 
    .subjekt = "", 
    .sein = "", 
    .haben = "", 
    .possessiv = "", 
    .reflexiv = "", 
    .accusativ = "", 
    .dativ = "" 
}; 

char *option = argv[1]; 
+0

請出示linie'和'option'的'定義。 – dasblinkenlight

+0

容器和循環。你應該真正學習「0-1多條規則」。 –

+3

不幸的是,這在C中是不可能的,因爲它沒有反射或動態代碼能力。 –

回答

4

你混合編譯時和運行時選項。在C中,不能直接從運行時獲得的字符串中使用標識符。但是,您可以將您的比較儀變成不透明的功能。

char *f(const satz *linie, const char *option) 
{ 
    if (strcmp(option, "sein") == 0) 
     return linie->sein; 
    else if (strcmp(option, "haben") == 0) 
     return linie->haben; 
    else if (strcmp(option, "possessiv") == 0) 
     return linie->possessiv; 
    else if (strcmp(option, "reflexiv") == 0) 
      return linie->reflexiv; 
    else if (strcmp(option, "accusativ") == 0) 
     return linie->accusativ; 
    else if (strcmp(option, "dativ") == 0) 
     return linie->dativ; 
    else 
     return NULL; 
} 

*option = f(&linie, *option); 
+0

混淆了comile-time和運行時字符串Kirilenko是對的。我會說這是一樣好,因爲它會得到。謝謝您的回答。 – user1408643

5

基裏連科的答案是一個很好的答案,適用於像你這樣的短結構。但是,對於更長的結構,保持所有的strcmp調用可能很麻煩。爲了解決這個問題,您可以定義您嘗試匹配的關鍵字與結構中相應元素的偏移之間的關係。

struct relation 
{ 
    char keyword[20]; 
    int offset; 
}; 

然後,您可以使用offsetof宏(在stddef.h中)將關鍵字鏈接到其在結構中的位置。

#define REL_LEN (7) 

struct relation rel[REL_LEN] = { 
    {"subjekt", offsetof(satz, subjekt) }, 
    {"sein", offsetof(satz, sein) }, 
    {"haben", offsetof(satz, haben) }, 
    {"possessiv", offsetof(satz, possessiv) }, 
    {"reflexiv", offsetof(satz, reflexiv) }, 
    {"accusativ", offsetof(satz, accusativ) }, 
    {"dativ", offsetof(satz, dativ) } 
}; 

最後,使用上面的映射檢索字符串的函數可能看起來像這樣。

char *lookup_keyword(const satz *linie, const char *option, 
        const struct relation *rel, size_t rel_size) 
{ 
    int i; 
    char *pchar = (char *)linie; 

    for (i=0; i<rel_size; i++) 
    { 
     if (strcmp(option, rel->keyword) == 0) 
     { 
      pchar += rel->offset; 
      return pchar; 
     } 
     rel++; 
    } 
    printf("Error: no mapping found matching %s!\n", option); 
    return ""; 
} 

你可以調用它像這樣

char *option = argv[1]; 

printf("Result for %s: %s\n", option, 
     lookup_keyword(&linie, option, rel, REL_LEN));