2014-07-01 40 views
-1

我剛開始學習字符串,並有一個關於使用指針參數向函數發送字符串數組的問題。我試圖簡單地打印數組中的一個字符串,但我甚至不能這樣做。字符串指向字符串數組的參數?

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

int stringSum(char *s); 
/*void minMaxValues(char *s, int *min, int *max);*/ 

int main(void) 
{ 
    int value; 
    char* text[] = { "1 + 2 + 3 + 4", 
        "7", 
        "30 + 20 + 10", 
        "9 + 900 + 90000 + 9000 + 90" }; 
    stringSum(&text); 
} 

int stringSum(char *s) 
{ 
    printf("%s\n",s[0]); 
} 

我試着編譯時遇到了一些名爲分段錯誤的錯誤。我只是將字符串數組的地址傳遞給函數是不正確的?幫助將不勝感激

+0

即時通訊最終處理函數中的字符串,但現在我只是檢查我是否正確發送它 – Jovis13

+0

'int stringSum(char * s []);'...'stringSum(text);' – BLUEPIXY

回答

0

兩個問題:

  1. 你傳遞一個字符串數組作爲參數傳遞給函數的地址。這應該給你一個很大的警告。

  2. 你告訴printf打印一個字符串,但然後傳遞一個字符作爲參數。這也應該給你一個很大的警告。

以上兩者都導致undefined behavior

要解決這些問題,首先你必須用一個字符串來調用它,就像

stringSum(text[0]); 

,那麼你必須打印字符串:

printf("%s\n", s); 

吸取的教訓:閱讀警告並修復。警告通常是undefined behavior的指示符,在很多情況下會導致程序崩潰,例如分段錯誤。

+0

有什麼辦法可以將整個字符串數組發送到函數而不必多次調用該函數嗎? – Jovis13

+1

@ user3686360當然有,但是你必須修改參數爲一個字符串數組。 –

+0

我因爲我在回答評論中給出的原因而低估了自己的評價(我只獲得了足夠的評論和讚譽聲譽,因此延誤了)。你通過重組OP代碼來回答問題,所以我不認爲這是回答他的實際問題。這不是一個簡單的重組 - OP想要傳遞整個字符串數組,您改變了他的代碼來傳遞一個字符串。 –

2

你的函數頭更改爲:

int stringSum(char **s); 

這可以讓你通過整個數組。你當前正在做的是將單個字符串傳遞給該方法,然後僅打印第一個字符(s[0])。

也沒有必要通過引用傳遞數組。只需stringSum(text);就可以。這是因爲您想要將數組地址的傳遞給該方法。當您爲它編制索引(使用s[0])時,您正在訪問數組中第一個字符串的地址。


還有,記得從stringSummain返回一個值,雖然這是完全無關的錯誤。

+0

這怎麼可以通過'char(*)[]'類型? – haccks

+0

@haccks如果知道's'中的元素個數,可以使用'char * s []'符號,所以它會是:'char * s [4]'在函數定義中。你也沒有從'main'返回任何可能導致警告/錯誤的東西。 參見:http://ideone.com/pFZ2uB – SimpleJ

+0

@SimpleJ;我不是那個問這個問題的人:) – haccks