2012-10-22 181 views
1

我開始學習C,並希望從命令行輸入字符並將它們排序爲一個數組,以便行號是ASCII字符編號,列是輸入字符的索引。我知道這必須通過realloc和malloc動態完成,但我不知道如何對其進行編碼。有人可以幫我解決這個問題嗎?Realloc二維數組

#include <stdio.h> 
#include <stdlib.h> 
#include <strings.h> 
#include <string.h> 
#include <assert.h> 
#include <ctype.h> 

#define totalASCII  256 
int 
main(int argc, char **argv) { 
int locat; 
char current; 
int **dRow=NULL; 

dRow = malloc(totalASCII*sizeof(*dRow)); 


for(locat=0;scanf("%c", &current)==1;locat++) { 
    /* I don't know what to put here */ 
    } 
return 1; 
} 
+0

** dRow是指向指針的指針而不是指向數組的指針,因此分配內存並訪問它將導致分段錯誤 – Omkant

回答

0

您的數據太小了,真的不需要從堆中分配它。只需使用一個數組:

struct { char character; int input_index; } input_data[totalASCII]; 

在一個典型的32位系統,這將使用約256 * 8或2 KB的內存,這真的不是那麼多。

然後存儲將是:

for(locat = 0; scanf("%c", &current) == 1; locat++) 
{ 
    input_data[locat].character = current; 
    input_data[locat].input_index = locat; 
} 
+0

如何對列中的字符建立索引? – user1658996

+0

當多次給予同一個字符時,它將如何存儲? – Rohan

+0

沿行移動到下一個空列 – user1658996

0

免責聲明:沒有編譯和運行代碼。

嘗試這樣:

int prev_size = 1; 

dRow = calloc(totalASCII, sizeof(*dRow)); //use calloc 

for(locat=0;scanf("%c", &current)==1;locat++) { 
    if(dRow[current]) { 
     prev_size=0; 
     //try to find how much is already allocated 
     while(dRow[current][prev_size] != -1) 
      prev_size++; 

     dRow[current] = realloc(sizeof(int) * (prev_size+1)); 
    } 
    else { 
     prev_size = 1; 
     dRow[current] = malloc(sizeof(int) * (prev_size+1)); 
    } 
    dRow[current][prev_size-1] = locat; 
    dRow[current][prev_size-1] = -1; //end identifier 

} 

的複雜性在這裏是要找到以前分配的大小。由於沒有其他結構/數據結構來存儲此信息,因此此示例代碼嘗試遍歷數組並找到假定爲結束標記的-1