-1

5000 の名前と 5000 の対応する給与のリストを配列に格納するようなデータベースを作成したいのですが、コンソールがクラッシュするか、コンパイラが次のエラーを表示するため、単に問題を見つけることができません:「変換できません」 char* ( )[30]' to 'char ' for argument '1' to 'char*' fgets(char*,int,*FILE)".

編集:コードで理解できるものはすべて変更しましたが、特にこの行に問題があるようです:

person* TAB = calloc(N, sizeof(struct)); 

他のエラー (経験不足) を見つけることができません。また、fgets の代わりに何を使用すればよいか正確にわかりません。

#include <stdio.h>
#include <stdlib.h>
#define N 5000
typedef struct {
  char name[30]
  int  salary;
} person;
int main()
{
person* TAB = calloc(N, sizeof(struct));
FILE * input;
input = fopen("in.txt","r+");
int nr=0;
int r;
while(nr<5000)
    {
      fscanf(input,"%s",TAB[nr].name);
      fscanf(input,"%d",TAB[nr].salary);
      nr++;
    }
printf("%s %d",TAB[1].name,TAB[1].salary);
fclose(input);
return 0;
}
4

3 に答える 3

1

それほど多くのデータをスタックに置くことは本当に避けるべきです。これは、そのような通常の変数が一般的に行うことです。約 5000 * (30 + 4 * 5000) = 95 MB のスタック スペースを占有します。これは、オペレーティング システムが妥当と考えるよりも大きい可能性があります。

とにかく、修正はこれをヒープに割り当てないことです。修正は、宣言を変更することです。1 人あたり5000 の給与にスペースを割り当てているため、論理エラーがあると思いますが、これはおそらくあなたが意図したものではありません。

また、nameフィールドは文字の配列である必要がありますが、文字ポインターの配列として宣言しました。これが警告のすべてです。

私はあなたが持っているべきだと思います:

struct person
{
    char name[30];
    int  salary;
};

これにより、メモリ使用量がstruct person TAB[N];約 5000 * (30 + 4) または約 166 KB に低下します。これはより合理的です。intこれは、かなり一般的な状況である4 バイトを想定しています。

最後に、あなたのファイル読み取りコードはうまく設計されていないため、おそらく機能しません。

を使用fgets()して行を読み取り、失敗したときに停止し (つまり、 を呼び出さないfeof())、各行を読み取りとして解析/トークン化することを検討してください。名前には空白を含めることができることに注意して%sくださいsscanf()

于 2013-10-06T16:58:16.770 に答える
1

name 構造体メンバーは 30 文字のポインターとして宣言されるべきではなく、給与は名前ごとに 1 つであるため、次のようになります。

typedef struct {
  char name[30]
  int  salary;
} person;

今、それを配列として持つためには、ヒープに割り当てるのが最善です

person* persons = calloc(N, sizeof(struct));

一人の名前と給与にアクセスできるようになりました

persons[3].name
persons[3].salary

...

fgets(persons[nr].name,30,input); // although u may want to remove \n
于 2013-10-06T17:01:16.203 に答える
0
struct person
{
    char* name[30];

私はあなたが意味すると思いますchar name[30]。これは、最大 29 バイトの1 つの名前が必要な場合です。

後で次のようにします。

fgets(&TAB[nr].name,30,input);

なぜアドレスを取得するのですか?上記の変更を行う場合、TAB[nr].nameはタイプchar[30]である必要があり、必要に応じて に縮退する必要がありchar*ます。

于 2013-10-06T17:00:32.750 に答える