2015-04-26 73 views
0

所以我想寫一個函數,將採取兩個指針字符並返回一個新的指針,以他們的連接。這裏是我的嘗試:Tricky C字符指針問題

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

char * append (char *, char *); 

int main(void) { 

    char *start = "start"; 
    char *add = "add"; 
    char* newString = append(start, add); 
    printf("%s\n", newString); 
    return 0; 
} 

char * append(char *start, char *add) { 
    char *newArray = malloc(sizeof(char) * 100); 
    //get to end of start word 
    while (*start != '\0') { 
    *newArray = *start; 
    newArray++; 
    start++; 
    } 
    while (*add != '\0') { 
    *newArray = *add; 
    newArray++; 
    add++; 
    } 
    return newArray; 
} 

兩個問題:

1)截至目前它編譯但沒有被打印出來。我認爲這是因爲我的append函數返回一個指向串聯字符末尾的指針。我應該創建一個臨時字符指針,並在開始時將它設置爲newArray(所以我可以返回它)?否則,我必須以某種方式減少我的指針,直到我重新開始。但沒有任何價值(像'\ 0'的字符串的末尾),這將告訴我我在字符數組的開始處...

2)我讀到,我不能只是採取sizeof()是一個char指針,所以我不確定在我的append函數的第一行中作爲我的參數傳遞給malloc。 100只是一個「足夠大的」幻數,我想擺脫...

如果我能採取的sizeof()一個字符指針,我只是做:

char *newArray = malloc(sizeof(strlen(start) + strlen(add)) + 1); 

感謝您的幫助,

bclayman

回答

2

1)是的,你需要一個指針保存到分配的內存的開頭,這樣就可以返回。它更好地把那個指針看作是「真實」指針,並且當你將字符存儲爲臨時時指針增加,但它確實沒有區別 - 指針是指針

2)這就是strlen是因爲它會告訴你字符串的長度。所以,你要

char *newArray = malloc(strlen(start) + strlen(add) + 1); 

無需sizeof可言。

有了這些,你最終:

char *append(char *start, char *add) { 
    char *newArray = malloc(strlen(start) + strlen(add) + 1); 
    if (!newArray) return 0; // out of memory 
    char *copy = newArray; 
    //get to end of start word 
    while (*start != '\0') 
    *copy++ = *start++; 
    while (*add != '\0') 
    *copy++ = *add++; 
    *copy = 0; // add a final NUL terminator 
    return newArray; 
} 
+0

是更完整的你認爲在運算的架構有一個8位char類型的大小。 – rhubarbdog

+0

@rhubarbdog:根據定義,'sizeof(char)== 1'總是 - 字符中的位數不會進入它。沒有任何理由在程序中使用'sizeof(char)'。 –