2016-12-11 13 views
2

ユーザー(コンソール)からデータを読み取ろうとしています。ユーザーのデータ例は次のとおりです。Cで整数の書式付き配列を読み取る

0 : [ 83, 42, 7 ] 
21:[3, 6, 8, 12, 9, 3, 6, 8, 12] 
63 : [ 8, 12, 9, 3, 6, 8 ] 
0 : [ 20, 31, 70 ] 

入力はEOFで終了します。

整数の配列([]内の配列)とデータの行数はわかりません。私は行の最初の数字であるキーで配列を(大括弧 - []内の整数)に保存したい。動的配列を書き込む

は問題ではありません。

typedef struct { 
    int *array; 
    size_t used; 
    size_t size; 
} Array; 

void initArray(Array *a, size_t initialSize) { 
    a->array = (int *)malloc(initialSize * sizeof(int)); 
    a->used = 0; 
    a->size = initialSize; 
} 

void insertArray(Array *a, int element) { 
    if (a->used == a->size) { 
    a->size *= 2; 
    a->array = (int *)realloc(a->array, a->size * sizeof(int)); 
    } 
    a->array[a->used++] = element; 
} 

void freeArray(Array *a) { 
    free(a->array); 
    a->array = NULL; 
    a->used = a->size = 0; 
} 

、その後のint main()の:

Array messages; 
initArray(&messages, 10);  
insertArray(&messages, x); // x is the number we are reading 

私はキーが配列の最初の要素であると言うことができます。

しかし、私はどのように入力を解析し、メッセージの配列を埋めるのかわかりません。

また、同じキーを持つ行は、同じ配列に保存する必要があります(ただしこれは詳細です)。

+2

1)一般的に 'malloc'&friendsや' void * 'の結果をキャストしないでください。 2)広すぎる。あなたが何を試して死ぬのですか、それはなぜ失敗しましたか? – Olaf

+0

'a-> size == 0'ならあなたはUBです。 – Stargateur

+0

'realloc'は失敗し、' NULL 'と照合します。 – Inline

答えて

1

あなたはこれを試すことができます。

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

#define LINELEN 100 
#define INITSIZE 10 

typedef struct { 
    int *array; 
    int key; 
    size_t used; 
    size_t currsize; 
} line_t; 

typedef struct { 
    line_t *lines; 
    int numlines; 
} array_t; 

array_t *initialize_array(void); 
void generate_line(array_t *A, int index); 
void insert_into_array(array_t *A, int index, char *number); 
void printfree_array(array_t *A); 
void check_ptr(void *ptr, const char *msg); 

int 
main(int argc, char *argv[]) { 
    char line[LINELEN]; 
    char *key; 
    array_t *A; 
    size_t arrsize = INITSIZE, count = 0; 

    A = initialize_array(); 

    A->lines = malloc(arrsize * sizeof(line_t)); 
    check_ptr(A->lines, "Allocation"); 

    printf("Enter data into console:\n"); 
    while (fgets(line, LINELEN, stdin) != NULL && strlen(line) != 1) { 

     if (arrsize == count) { 
      arrsize *= 2; 
      A->lines = realloc(A->lines, arrsize * sizeof(line_t)); 
      check_ptr(A->lines, "Reallocation"); 
     } 

     generate_line(A, count); 

     key = strtok(line, " :[],"); 

     A->lines[count].key = atoi(key); 

     while ((key = strtok(NULL, " :[],\n")) != NULL) { 
      insert_into_array(A, count, key); 
     } 

     count++; 
     A->numlines++; 
    } 

    printfree_array(A); 

    return 0; 
} 

void 
printfree_array(array_t *A) { 
    int i, j; 

    printf("Your array of structures:\n"); 
    for (i = 0; i < A->numlines; i++) { 
     printf("key = %d, ", A->lines[i].key); 

     printf("array = ["); 
     for (j = 0; j < A->lines[i].used; j++) { 
      printf("%d", A->lines[i].array[j]); 

      if (j != A->lines[i].used-1) { 
       printf(", "); 
      } 
     } 
     free(A->lines[i].array); 
     printf("]\n"); 
    } 
    free(A->lines); 
    free(A); 
} 

void 
insert_into_array(array_t *A, int index, char *number) { 
    if (A->lines[index].currsize == A->lines[index].used) { 
     A->lines[index].currsize *= 2; 
     A->lines[index].array = realloc(A->lines[index].array, 
             A->lines[index].currsize * sizeof(int)); 
     check_ptr(A->lines[index].array, "Reallocation"); 
    } 
    A->lines[index].array[A->lines[index].used++] = atoi(number); 
} 

void 
generate_line(array_t *A, int index) { 
    A->lines[index].currsize = INITSIZE; 
    A->lines[index].used = 0; 
    A->lines[index].key = 0; 
    A->lines[index].array = malloc(A->lines[index].currsize * sizeof(int)); 
    check_ptr(A->lines[index].array, "Allocation"); 
} 

array_t 
*initialize_array(void) { 
    array_t *A = malloc(sizeof(*A)); 
    check_ptr(A, "Allocation"); 

    A->lines = NULL; 
    A->numlines = 0; 

    return A; 
} 

void 
check_ptr(void *ptr, const char *msg) { 
    if (!ptr) { 
     printf("Unexpected null pointer: %s\n", msg); 
     exit(EXIT_FAILURE); 
    } 
} 

プログラムの出力hereを。

+0

これは@Mykyboの助けとなりました。私はこれをすばやく書きましたが、コードになにか意味がないのかどうか私に知らせてください。 – RoadRunner

関連する問題