2017-03-06 5 views
1

C初心者はここで、これを解決するために苦労します。同じタイプの構造要素を反復する

私は現在、構造データを出力する機能を構築していますが、データが存在するかどうかをチェックする前に出力しています。

これは私の現在のソリューションである:ここ

if (strcmp(P.strFullName.arcTitle, " ") != 0) 
    printf("%s ", P.strFullName.arcTitle); 

if (strcmp(P.strFullName.arcFirstName, " ") != 0) 
    printf("%s ", P.strFullName.arcFirstName); 

if (strcmp(P.strFullName.arcMiddleName, " ") != 0) 
    printf("%s ", P.strFullName.arcMiddleName); 

if (strcmp(P.strFullName.arcSurname, " ") != 0) 
    printf("%s ", P.strFullName.arcSurname);   
printf("\n"); 

すべての構造要素は文字列であり、そして私は、理想的にはifとprintfの機能を持つ2本のキーラインをループできるようにしたいと思い、単に変更ループが各インクリメントを調べている構造要素。

これを簡略化する方法はありますか?

+0

構造体に文字列の配列を持っていないのはなぜ、単にループを使用する:あなたがすでに持っていたが、今もこのデータをループすることができるものとそう非常に似

? – Peter

+0

struct defenitionを追加できますか? –

+0

[This Q/A](http://stackoverflow.com/questions/1784782/is-there-any-way-to-loop-through-a-struct-with-elements-of-different-types-in- c)役に立つでしょう。 –

答えて

2

if条件を保持する小さな関数を記述することもできます。

void CheckAndPrint(char *str) 
{ 
    if (strcmp(str, " ") != 0) 
     printf("%s ", str); 
} 

そして、メインコードにあなたのようにそれを呼び出すことができますが、

CheckAndPrint(P.strFullName.arcTitle); 
CheckAndPrint(P.strFullName.arcFirstName); 
CheckAndPrint(P.strFullName.arcMiddleName); 
CheckAndPrint(P.strFullName.arcSurname); 

これは多分あとで印刷する前に別のチェックを追加したい場合は、それだけで行う必要があります利点を持っています一箇所。

0

あなたが本当に「反復」しなければならない場合は、各メンバーのオフセットを計算する標準offsetofマクロを使用して、構造体のアドレスを介してアクセスすることができます

struct full_name { 
    char const *arcTitle; 
    char const *arcFirstName; 
    char const *arcMiddleName; 
    char const *arcSurname; 
}; 

void print_full_name (struct full_name *fname) { 
    size_t offest[] = { 
    offsetof(struct full_name, arcTitle), 
    offsetof(struct full_name, arcFirstName), 
    offsetof(struct full_name, arcMiddleName), 
    offsetof(struct full_name, arcSurname) 
    }; 

    for (size_t idx = 0; idx < sizeof(offset)/sizeof(offset[0]); ++i) { 
    char *mem_raw_ptr = (char*)fname + offset[idx]; 
    char const *str = *(char const **)mem_raw_ptr; 

    if (strcmp(str, " ") != 0) 
     printf("%s ", str); 
    } 
} 

が特定されることをすべてのメンバーあなたは同じタイプの "iterate"を繰り返しています!そして、あなたがそのメンバへのポインタを計算することを覚えておいてください。ポインタが必要な場合はポインタを使用する必要があります(おそらくheavenは配列へのポインタを禁止します)。

0

1つの解決方法は、同じメモリ領域に異なる変数名を割り当てることです。個々の変数名を持つように扱い、同時に配列として扱うことができます。そのためには、ユニオンを使用することができます。

typedef struct 
{ 
    const char* title; 
    const char* firstName; 
    const char* middleName; 
    const char* surname; 
} arcStr; 

typedef struct 
{ 
    ... 
    union 
    { 
    arcStr arc; 
    const char* array[4]; 
    }; 
    ... 
} some_struct; 

使用法:P.strFullName.arc.title

for(size_t i=0; i<4; i++) 
{ 
    if (strcmp(P.strFullName.array[i], " ") != 0) 
    printf("%s ", P.strFullName.array[i]); 
} 
関連する問題