2013-06-24 60 views
0

我想在C中定義不同的字符串數組,然後它可以是例如選擇取決於一些其它值,即像以下:如何在C中選擇一個字符串數組?

char foo[][10] = {"Snakes", "on", "a", "Plane"}; 
char bar[][10] = {"Fishes", "in", "a", "Lake"}; 
char *choice; 
if (flag == 1) { 
    choice = &foo; 
} else if (flag == 2) { 
    choice = &bar; 
} 
printf("%s%s\n", choice[0] , choice[1]); 
萬一 flag

預期的結果是1:

Snakeson

萬一flag預期的結果是2:

Fishesin

但上面的代碼給出segmentation fault錯誤,而我嘗試了不同的defini char,即char*char**。如何做到這一點?有沒有在這個問題一個很好的教程,即在指針,數組,什麼foo到底是在上面的例子...

+0

請參閱printf的手冊頁。嘗試使用printf(「%s%s \ n」,選擇[0],選擇[1]); –

+3

與警告編譯(gcc:'-Wall') –

+0

@Maneolin - 你是對的 - 我更新了代碼。但是錯誤仍然是一樣的('段錯誤')。 – Alex

回答

5

這是更容易,如果你只是用指針數組:

int main(void) 
{ 
    const char *foo[] = { "Snakes", "on", "a", "Plane" }; 
    const char *bar[] = { "Fishes", "in", "a", "Lake" }; 
    const int flag = 17; 
    const char **choice = (flag == 1) ? foo : bar; 

    printf("%s %s\n", choice[0], choice[1]); 

    return 0; 
} 

上面打印

Fishes in 
+0

你的建議似乎工作!我會在實際的代碼中嘗試。 – Alex

2

隨着字符數組,你需要這樣的:

char foo[][10] = {"Snakes", "on", "a", "Plane"}; 
char bar[][10] = {"Fishes", "in", "a", "Lake"}; 
char (*choice)[10]; 
if (flag == 1) { 
    choice = &foo[0]; 
} else if (flag == 2) { 
    choice = &bar[0]; 
} 
printf("%s%s\n", choice[0] , choice[1]); 

佛r choice[1]指向正確的插槽,它必須是指向陣列元素類型的指針,並初始化爲&foo[0]而不是&foo。儘管它們是相同的地址,但它們是不同的數據類型。


如果你想choice是一個指向2昏暗的字符數組,這是可以做到,但你必須聲明指針時,同時指定陣列的尺寸和記得取消對它的引用:

char foo[][10] = {"Snakes", "on", "a", "Plane"}; 
char bar[][10] = {"Fishes", "in", "a", "Lake"}; 
char (*choice)[4][10]; 
if (flag == 1) { 
    choice = &foo; 
} else if (flag == 2) { 
    choice = &bar; 
} 
printf("%s%s\n", *choice[0] , *choice[1]); 
相關問題