2015-04-28 180 views
0

我目前正在編寫一個應用程序,我需要一個C函數來返回一個數組。我讀過C函數直接不能返回數組,但指向數組,但無論如何,我仍然不能使它工作。我發送了一個字符串,其中有幾個數字值,我必須將其放入數組中。從C函數返回一個數組

我的代碼看起來是這樣的,其中的主要功能是:

int main() { 
    char arr[3] = {0}; 
    char *str = "yaw22test242test232"; 
    foo(arr,3,str); 

    printf("%d\n",arr[0]); 

    return 0; 
} 

在我想要的foo功能與數字分別爲22,在陣列位置242和232 0,1和2返回一個數組。 foo函數中的算法在主程序中使用時正常工作,但不是這樣。有什麼辦法可以解決這個問題嗎?我究竟做錯了什麼?該foo功能如下所示:

void foo(char *buf, int count, char *str) { 
    char *p = str; 
    int k = 0; 

    while (*p) { // While there are more characters to process... 
     if (isdigit(*p)) { // Upon finding a digit, ... 
      double val = strtod(p, &p); // Read a number, ... 
      //printf("%f\n", val); // and print it. 
      buf[1-count-k] = val; 
      k++; 
     } else { // Otherwise, move on to the next character. 
      p++; 
     } 
    } 
} 
+0

刪除了C++ flasg,對不起! – Carl

+0

請澄清它是如何工作的。期望的行爲是什麼,它做什麼呢?有沒有錯誤信息? –

+0

它返回的結果都是零,但是這是因爲我將'arr'變量聲明爲'char'而不是'double'。現在它正在工作。 – Carl

回答

0

它看起來像你想提取字符串中的數字作爲double s,但你試圖將它們存儲在一個char數組中。這甚至沒有編譯。

因此,首先,使用適當的緩衝:

int main() { 
    double arr[3] = {0}; 
    /* ... */ 
} 

,並更新foo()參數聲明:

void foo(double *buf, int count,char *str) { ... } 

然後解決這個問題:

buf[1-count-k] = val; 

你可能想一些簡單的事情:

buf[k++] = val; 

最後,您可能想要返回k,以便調用者有機會知道有多少數字被寫入到數組中。所以,foo應該是這樣的:

size_t foo(double *buf, int count,char *str) { 
    char *p = str; 
    size_t k = 0; 

    while (*p) { // While there are more characters to process... 
     if (isdigit(*p)) { // Upon finding a digit, ... 
      double val = strtod(p, &p); // Read a number, ... 
      //printf("%f\n", val); // and print it. 
      buf[k++] = val; 
     } else { // Otherwise, move on to the next character. 
      p++; 
     } 
    } 
    return k; 
} 

需要注意的是正確的類型索引數組是size_t,而不是intsize_t保證足夠寬以容納任何數組的大小,因此如果您希望代碼使用任意長的數組,則應使用size_t來索引數組。

+0

我要試試這個!感謝所有的幫助! – Carl

2

那麼你會出界這裏:

buf[1-count-k] = val; 

也許你的意思是這樣buf[k] = val;和檢查if(k >= count)結束循環。

由於char *buf通常無法表示大於127的值,因此應該使用足夠大的整數類型或雙精度型,否則從double類型到char類型的賦值buf[*] = val;將導致未定義的行爲。

+0

請注意,'buf'是'char'的數組,'val'是'double'。所以'k'不能用作有效索引,並且'buf'必須是合適的大小,考慮到大小差異。 – rubikonx9

+0

@ rubikonx9 k很好(假設指數正確),賦值(通常)不是。 – 2501

0

我會推薦使用一個向量結構而不是數組。這已經有很多實現了(參見C的GLib列表)。但是,如果你想「滾你自己」,嘗試一些與此類似:

typedef struct 
{ 
    char** data; 
    int size; 

} str_vector; 

在這裏您可以動態分配一個str_vector及其data成員,並返回這一點。我不會詳述太多的細節,因爲在互聯網上有很多這方面的教程,我相信你可以在Google/Bing /無論以幾秒鐘的方式提出:)