2016-01-28 54 views
1

現在我正在嘗試創建一個函數,它接受一個字符串和一個字符的長度,並且它應該輸出x個字符。根據z的長度返回x個y字符的數量

例如:

// char *string = "Hello"; (not actual code) 
get_chars(strlen(string), "*"); // #=> ***** 

但我不斷收到轉換錯誤,我根本無法找到一個解決問題的辦法。我使用的功能是:

char 
*get_chars(int number, char *ch) 
{ 
    int i = 0; 
    char buffer[number]; 

    for (i; i < number; i++) 
    { 
     buffer[i] = ch; 
    } 

    return buffer; 
} 

其中,調用時,產生:

assignment makes integer from pointer without a cast 
+1

'buffer [i]'是'char','ch'是'char *',這個賦值是不兼容的。也許你的意思是'ch [0]'。但是在任何情況下,你都試圖返回一個指向數組的函數返回的指針,這個計劃永遠不會工作。 –

+0

是的,該函數在被調用之前被聲明。它如何被破壞? –

+1

當您在'{}'內聲明變量時,該變量在執行退出該範圍時被銷燬。 –

回答

6

,首先讓我們來檢查你函數的參數:

char *get_chars(int number, char *ch) 

好了,所以我們有接受一個號碼,一個指向char,並返回一個指向char的方法。現在該方法的意圖是生成一個由相同的char重複的時間組成的字符串,那麼爲什麼你通過char*而不是char

它沒有意義傳遞一個char*,除非你真的想將指針傳遞給現有的單char而不是直接的性格,但我看不出有任何理由這樣做你的情況,所以你簽名應該成爲

char* get_chars(int number, char ch) 

現在,buffer[i] = ch;轉讓不會產生任何問題,你的施法錯誤消失。

那麼讓我們來看看在函數內部發生了什麼:

char buffer[number]; 
... 
return buffer; 

因此變長數組被創建爲堆棧中的局部變量,然後將其地址衰減到char*指針,並返回。但是從函數返回後,本地堆棧被清除,並且剛返回的地址不再有任何意義。在這裏,您可以有兩個解決方案:

  • 傳遞char*通過該方法來填充(和分配由主叫方)
  • 在被叫分配內存在意的是,那麼你就需要free

首先解決方案轉化爲類似:

void get_chars(char* buffer, int length, char ch) { 
    ... 
} 

雖然第二個解決方案會是這樣的:

char* get_chars(int length, char ch) { 
    char* buffer = calloc(length+1, 1); 
    ... 
    return buffer; 
} 

介意,我使用length+1因爲一個C字符串應該是NUL終止由\0或任何庫函數將無法知道它在哪裏結束。

1

bufferchar

陣列所以,buffer[i]char

chchar *

因此buffer[i] = ch會引發錯誤。

要麼改變chchar並相應地傳遞值('*'代替"*"),或做buffer[i] = ch[0]

無論如何,你不能只是返回buffer;它在函數結束時被破壞。

0

char *ch更改爲char ch,並將您的電話從get_chars(strlen(string), "*");更改爲get_chars(strlen(string), '*');

+0

'printf%s'這個用於需要'char *',但是我應該把它轉換成'char *'類型嗎? –

+0

當你想打印'char'而不是'char *'時,你可以使用'%c'。 – Paulo

相關問題