1

我开始学习 C 并且想从命令行输入字符并将它们排序到一个数组中,这样行号是 ASCII 字符号,列是输入字符的索引。我知道这必须通过 realloc 和 malloc 动态完成,但我不知道如何对其进行编码。有人可以帮我解决这个问题吗?

#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;
}   
4

2 回答 2

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;
}
于 2012-10-22T08:52:24.373 回答
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假定为结束标记的数组。

于 2012-10-22T09:11:51.390 回答