2013-03-13 101 views
1

我有這個函數,bits_show,打印到標準輸出一個2-3位長的代碼。使用for循環將字符存儲到字符串中?

void bits_show(bits *a) 
{ 
    int i; 
    for (i = 0; i < a->next; i++) 
    putchar(a->bits[i]); 
} 

其中位:

struct bits { 
    int capacity; 
    int next; 
    char *bits; 
}; 

我試圖寫一個函數,字符* bits_char(位一)捕獲這些字符,並將其收集到一個單一的字符文件。

這是我迄今爲止,但它一直吐痰錯誤:

char* bits_char(bits *a) 
{ 
    char* str = (char*) malloc(sizeof(a->next * char)); 
    int i; 
    for (i=0; i<a->next; i++){ 
    str[i] = (a->bits[i]); 
    } 
    return str; 
} 

「bits.c:在函數 'bits_char':

bits.c:33:錯誤:可變大小的對象可能不被初始化

bits.c:37:警告:函數返回本地變量」

+0

我添加了一個malloc,但我仍然收到一個錯誤,指出malloc行上的「char'之前的期望表達式」。 – 2013-03-13 22:02:49

+0

更新代碼並顯示malloc – 2013-03-13 22:11:22

+0

我剛更新問題 – 2013-03-13 22:13:14

回答

2

的地址這是錯誤的:

sizeof(a->next * char) 

我想你的意思是寫:

a->next * sizeof(char) 

但由於sizeof(char)定義等於1則只需省略。

但即使這是錯誤的,因爲您需要爲您的代碼當前沒有寫入的空終止符空間。分配必須是:

malloc(a->next+1) 

並添加空終止這樣的:

str[a->next] = 0; 

總而言之,成品是這樣:

char* bits_char(bits *a) 
{ 
    char* str = malloc(a->next+1); 
    int i; 
    for (i=0; i<a->next; i++){ 
    str[i] = (a->bits[i]); 
    } 
    str[a->next] = 0; 
    return str; 
} 

我刪除了在C中不需要返回值malloc的投。

而且你也應該確保你檢查分配失敗的返回值malloc。如果失敗,它將返回空指針。我沒有展示如何做,因爲我不知道你的錯誤處理策略。

+0

malloc丟失後進行空值檢查。 +1 – 2013-03-13 22:21:39

+0

@BillyONeal謝謝,我有一種嘮叨的感覺,我忘記了一些東西! – 2013-03-13 22:25:03