2017-02-01 32 views
1

最近私はCプログラミングでは全く新しいですが、私はもう少しポインタを探すようになりました。私はコードに問題が発生しました。構造体とchar **

したがって、構造体にあるchar**に文字列を渡そうとしますが、私は常にエラーが発生しています。事前にありがとう、いくつかのコードがあります

これは私が使った構造体です。

typedef struct Queue { 
int capacity; 
int front; 
int rear; 
int size; 
char **car_id; 
}; 

これが私の考えです。あなたが見ることができれば最初の内に私はstrcpyにしようとするが失敗します。 * &または*を入れても。

printf("Printing the contect of the TXT file\n"); 
int countS=-1,countQ=-1; 
char line[10]; 
FILE *fp; 
fp = fopen("car.txt","r"); 
if (fp == NULL) { 
    printf("Error: File doesn't exist exiting the programm!"); 
    exit(1); 
} 
while(!feof(fp)){ 
     fgets(line,10,fp); 
     printf("%s",line); 

     if(line[(strlen(line))-2]=='Q'){ 
     countQ++; 
     line[strlen(line)-2] = 0; 
     strcpy(car_id,line); 
     strcpy(QBoat->car_id[countQ],car_id); 
     QBoat->rear=countQ; 
     QBoat->front=0; 
     QBoat->size=countQ; 
     }else if(line[(strlen(line))-2]=='S'){ 
     countS++; 
     line[strlen(line)-2] = 0; 
     SBoat->top = countS; 
     //strcpy(SBoat->car_id[countS],line); 
     } 

} 
fclose(fp); 
+3

'feof()'をループしないでください - http://stackoverflow.com/questions/5431941/why-is-while-feof-file-always-wrong –

+5

'QBoat-> car_id' –

+1

プログラム全体を投稿してください。 –

答えて

3

構造体を使用してメモリ割り当てと割り当て解除を行うのは非常に簡単です。ですから、すべての構造体に対して常に新しい関数と破壊関数を書くことが最善です。

/* To avoid confusion, it's best to declare structs as type definitions 
    and name them Something_t. Capital letter to avoid conflict with 
    built in types, _t to note that it is a type, and to avoid conflict 
    with other names. */ 
typedef struct { 
    /* Using size_t means less type casting */ 
    size_t capacity; 
    int front; 
    int rear; 
    int size; 
    char **items; 
} Queue_t; 

Queue_t *Queue_new(const size_t capacity) { 
    /* Use calloc because we have to zero everything anyway */ 
    Queue_t *queue = calloc(1, sizeof(Queue_t)); 

    /* Allocate enough space to store a list of whatever 
     queue->items is a list of */ 
    queue->capacity = capacity; 
    queue->items = malloc(capacity * sizeof(*(queue->items))); 

    return queue; 
} 

void Queue_destroy(Queue_t *queue) { 
    /* Since items were copied into the list, it's the queue's responsibility 
     to free them */ 
    for(int i = queue->front; i < queue->rear; i++) { 
     free(queue->items[i]); 
    } 

    /* Now free the list of items */ 
    free(queue->items); 

    /* And finally the struct itself */ 
    free(queue); 
} 

構造体が割り当てられているので、アイテムのリストは、あまりに多くのアイテムを追加しないようにする必要があります。キューに追加するコードは、キューの容量をオーバーランするかどうかを決して確認しません。このため、容量を正しくチェックするアイテムを追加する関数を作成することをお勧めします。

キューイングのロジックが間違っている可能性があります。キューはうまくいかないかもしれませんが、あなたはそのアイデアを得ます。後でキューを拡張して、自動的にサイズを変更することもできます。

ここでは、これらの作業を単独でテストすることができます。ファイルが正常に読み込まれたら、ファイルから読み込み、キュー機能を使用してみることができます。

int main() { 
    char filename[] = "car.txt"; 
    FILE *fp = fopen(filename,"r"); 
    if (fp == NULL) { 
     fprintf(stderr, "Couldn't read '%s': %s\n", filename, strerror(errno)); 
     exit(1); 
    } 

    /* Just picked a number out of thin air */ 
    Queue_t *qboats = Queue_new(256); 
    Queue_t *sboats = Queue_new(256); 

    char line[10]; 
    while(fgets(line, 10, fp) != NULL) { 
     size_t len = strlen(line); 

     /* Choose the right queue to use */ 
     Queue_t *queue; 
     switch (line[len-2]) { 
      case 'S': 
       queue = sboats; 
       break; 
      case 'Q': 
       queue = qboats; 
       break; 
      default: 
       fprintf(stderr, "Can't understand line '%s'\n", line); 
       continue; 
       break; 
     } 

     /* Chop off the identifier */ 
     line[len - 2] = '\0'; 

     /* Add to the queue */ 
     Queue_add(queue, line); 
    } 

    /* Do something with the queues. This should probably be Queue_print(). */ 
    for(int i = qboats->front; i < qboats->rear; i++) { 
     printf("qboat: %s\n", qboats->items[i]); 
    } 

    for(int i = sboats->front; i < sboats->rear; i++) { 
     printf("sboat: %s\n", sboats->items[i]); 
    } 

    /* Now clean them up */ 
    Queue_destroy(sboats); 
    Queue_destroy(qboats); 
} 

ほとんどの作業で、どのキューを使用するかが決定されています。

+1

'queue-> items = malloc(capacity * sizeof(char *));'のようなコードで、 'queue-> items = malloc(capacity * sizeof *)が見つかりませんでした。 (queue-> items)); 'コード化、レビュー、保守が容易です。 – chux

関連する問題