2016-12-11 2 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 

I 키 배열의 첫 번째 요소라고 말할 수있다.

그러나 입력을 구문 분석하고 메시지 배열을 채우는 방법을 모르겠습니다.

또한 동일한 키가있는 행을 동일한 배열에 저장해야합니다 (그러나 자세한 내용입니다).

+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