0

これで、出力は 4,5,6,25 になります。毎回構造体の 1 つのメンバーにアクセスするのではなく、構造体のすべてのメンバーを 1 回の試行で出力する方法。行の出力が [4 5 6] で年齢が 25 である場合のように。助けてください!

#include<stdio.h>

typedef struct person
{
  int row[3];
  int age;
} PERSON;

int main()
{
  PERSON p;
  PERSON *pptr=&p;
  pptr->row[0] = 4;
  pptr->row[1] = 5;
  pptr->row[2] = 6;
  pptr->age = 25;
  printf("%d\n",pptr->row[0]);
  printf("%d\n",pptr->row[1]);
  printf("%d\n",pptr->row[2]);
  printf("%d\n",pptr->age);
  return 0;
}
4

7 に答える 7

1

を使用している場合glibc(GNU libc、したがって を使用している場合にのみ使用可能で、portbale は使用できません) は、関数ファミリーの実装でgcc使用される「新しい」変換指定子を定義および登録することができます。を探している。glibcprintf

詳細については、 http://www.gnu.org/software/libc/manual/html_node/Registering-New-Conversions.html#Registering-New-Conversionsとhttp ://www.gnu. org/software/libc/manual/html_node/Defining-the-Output-Handler.html#Defining-the-Output-Handler

例はここにあります: http://www.gnu.org/software/libc/manual/html_node/Printf-Extension-Example.html#Printf-Extension-Example

于 2012-12-11T14:50:46.877 に答える
1

各メンバーにアクセスせずに「一度に」出力する方法はありませんが、複数の指定子を使用することでこのコードを少し減らすことができます。複数の構造体の値を出力する必要がある場合は、関数 (またはマクロ) を作成することを検討してください。これにより、コードの量を減らすことができます。

void
print_person (PERSON *p)
{
    printf(
        "[%d %d %d] %d\n",
        p->row[0],
        p->row[1],
        p->row[2],
        p->age
    );
}

print_person(&my_person);

ポインター アプローチを使用すると、構造体全体を引数としてコピーすることを回避できます。ただし、これらの単純な構造体を使用してシンプルに保ちたい場合があります。マクロアプローチ:

#define PRINTP(p) printf("[%d %d %d] %d\n", p.row[0], p.row[1], p.row[2], p.age)

PRINTP(p);
于 2012-12-11T14:47:06.353 に答える
0

メタプログラミングとトレイトを使用できる言語内ではそれを行うことができますが、C ではそのようなことを行う方法はありません。シモンクの答えは、ほとんどの人が使用するソリューションです。

于 2012-12-11T14:43:22.887 に答える
0

C は、これを自動的に行う方法を提供していません。

もちろん、独自のprint_struct_person関数を作成することもできますが、印刷する関数ごとに 1 つの関数を作成する必要があります。

デバッグ目的でこれを行う場合は、実際のデバッガーを試す必要があります。デバッガーはそれを行うことができます。

于 2012-12-11T14:43:35.447 に答える