0

郵便番号の値に基づいて、構造体を指すポインターの配列を並べ替える関数を書いています。オンラインで並べ替え関数を見つけ(並べ替え関数を作成するのは初めて)、それを試して何が起こるかを確認すると、「配列型'char[7]は割り当てできません」というエラーが表示され続けます。理由はわかりません。何かアイデアはありますか?

ありがとうございました。

struct personCatalog {
char name[50];
char address[50];
char cityState[50];
char zipCode[7];
} ;

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

void bubble_sort(struct personCatalog *arrayOfPointers[]){
    int num1 = 0;

    while (arrayOfPointers[num1] != NULL) {
    atoi(arrayOfPointers[num1++]->zipCode);
    }

        int progress = 0;

        do {
            int i;
            progress = 0;
            for (i = 0; i < num1 - 2; ++i) {
                if (arrayOfPointers[i]->zipCode > arrayOfPointers[i + 1]->zipCode) {
                    struct personCatalog  temp = *arrayOfPointers[i];
                    arrayOfPointers[i] = arrayOfPointers[i + 1];
                    arrayOfPointers[i + 1] = &temp;

                    progress = 1;
                }
            }
        } while (progress);
    }

私が受け取っているエラー

4

3 に答える 3

1

C言語は、本質的に7文字を他の7文字に割り当てる方法を知りません。一度に1つのプリミティブ型を別のプリミティブ型に割り当てることしかできません。

zipCode[0] = temp[0]
zipCode[1] = temp[1];
// etc.

のように連続しているCの配列をコピーするにはzipCode、次を使用できますmemcpy

memcpy(zipCode, temp, 7);

また、私の小さな画面であなたの意図を読み間違えた可能性もありますが、zipCodeに構造体ポインタを割り当てないでください。

于 2012-11-25T03:25:00.410 に答える
1

このコードにはいくつかの問題がありますが、強調表示された行の配列に値を割り当てようとしているため、このエラーが発生します。そのため、配列型への割り当てについて不平を言っていchar[7]ます。配列の場所を変更することはできないため、これはあまり意味がありません。の呼び出しでバイトを交換するmemcpyか、おそらくもっと慣用的に、char配列ではなくtrueになるstruct personCatalogように定義を変更することができます。zipcodechar *

于 2012-11-25T03:31:12.007 に答える
0

配列はポインタで構成されています。したがって、それらを交換するために使用している一時的なものもポインターである必要があります。

    for (i = 0; i < num1 - 1; ++i) {
            if ( strcmp( arrayOfPointers[i]->zipCode
                       , arrayOfPointers[i + 1]->zipCode
                       ) > 1) {
                struct personCatalog  *temp ;
                temp = arrayOfPointers[i];
                arrayOfPointers[i] = arrayOfPointers[i + 1];
                arrayOfPointers[i + 1] = temp;

                progress = 1;
            }
        }

また、ループ条件i < num1-2が間違っていました。num1 -1、IMOである必要があります。

更新:郵便番号がテキスト文字列であるように見えるので、">"を"strcmp()"に置き換えました

于 2012-11-25T21:53:14.837 に答える