2015-02-07 44 views
0

我目前正在嘗試在c中創建一個程序,它將返回一個指向2個字符串數組的指針。第一個是字符串s在奇數位置的字符,第二個是在偶數位置的字符。我在C中沒有經驗,所以我需要一些關於這個程序的幫助。我一直在嘗試使用python和java知道的代碼進行編碼,但它似乎沒有遵循與指針相同的原則。這裏是我的代碼:一個c程序,它返回一個指向2個字符串數組的指針

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

char **parity_strings(const char *s){ 

char dest[malloc((char)sizeof(s)/2 + 1)][malloc((char)sizeof(s)/2 + 1)]; //trying to allocate memory to an array of size 2 which will hold 2 strings. 

int i; 
for(i = 0; i < sizeof(s); i+= 2){ //iterating through odd strings 
    s[0] += dest[i]; 
} 
for(i= 2; i< sizeof(s); i += 2){ //iterating through even strings (I suppose i could have just appended using 1 for loop but oh well 
    s[1] += dest[i]; 
} 

return dest; 


} 

int main(int argc, char **argv) { 
char **r = parity_strings(argv[1]); 
printf("%s %s %s\n", r[0], r[1], argv[1]); 
return 0; 
} 

內存分配也只是一個痛苦...我不知道,如果它正在做我打算做它。我試圖將字符串的大小以字節+ 1字節分配給數組Dest的每個索引。

有關如何解決此問題的任何想法?謝謝。

回答

2

此行不會做任何好:

char dest[malloc((char)sizeof(s)/2 + 1)][malloc((char)sizeof(s)/2 + 1)]; 

malloc返回一個指向新分配的內存。在上面的行中,dest[][]中的方括號需要無符號整數。指針可以被轉換爲整數,但這不是你想要的。它可能會編譯,但它可能不會運行,當然不會做你想要的。

另外,sizeof(s)將指針的大小返回到s,而不是字符串的長度。 C中的字符串實際上只是以NULL結尾的數組char s,而數組通過指針傳遞給函數,而不是它們的全部內容。要獲取字符串的長度,請改爲使用strlen(s)

你可以做這樣的事情:

char *destodd = malloc((strlen(s)/2 + 2)); 
char *desteven = malloc((strlen(s)/2 + 2)); 
char **dest = malloc(sizeof(char *) * 2); 
dest[0] = desteven; 
dest[1] = destodd; 

我改變+ 1上面你來+2。長度爲3的字符串需要destodd中的3個字符:一個用於字符1,一個用於字符3,另一個用於NUL終止符。

在C中的malloc a multi-dimensional array很棘手。另一方面,一維數組很容易。只是把destodddesteven像他們的陣列,即使他們真的指針:

for (i = 0; i < strlen(s); i += 2){ 
    desteven[i] = 'a'; // Fix this 
    destodd[i] = 'b'; 
} 

的代碼在你for循環看起來並不像它會工作。看起來您可能一直試圖使用+=來連接字符串,但它只會添加數字。我無法很快弄清楚你應該在for循環中設置什麼,所以'a''b'只是佔位符。

1

您有幾個問題。正如你的編譯器應該告訴你的,char dest[malloc()]需要一個指向無符號的轉換,這是合法的,但不是你想要的。更重要的是,如果解引用指針,返回指向堆棧上分配的數組的指針會導致未定義的行爲,因爲編譯器可能已經釋放了內存。我不太確定函數的預期輸出是什麼,但是在填充兩個字符數組方面,我認爲最簡單的方法是:

char **parity_strings(char* buf) //Please avoid single letter variable names for anything but loop control 
{ 
    size_t buflen = strlen(buf); 
    if (NULL == char** dest = malloc(2 * sizeof(*dest))) 
     ;//handle memory allocation error 
    if (NULL == dest[0] = malloc(buflen * sizeof(*buf))) 
     ;//handle memory allocation error 
    if (NULL == dest[1] = malloc(buflen * sizeof(*buf))) 
     ;//handle memory allocation error 
    //Note that you would do the above two lines in a loop for a variable sized multidimensional array 
    strncpy(dest[0], buf, 500); 
    strncpy(dest[1], buf, 500); //If you need strings larger than 500 change as necessary, mostly only needed if you are taking input from someone else but it's good practice to use strncpy over strcpy) 
    return dest; 
} 
相關問題