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 に答える