2017-03-06 84 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

你可以添加结构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); 
    } 
} 

可以肯定,所有成员你“迭代”有相同的类型!并且记住你计算了一个指向该成员的指针,因此可能需要使用指向指针的指针(可能还有天堂禁止指向数组的指针)。

0

一个解决方案是使用分配不同的变量名称到同一个内存区域。将其视为具有单独的变量名称,同时能够将其视为数组。为了实现这一点,我们可以使用联合:

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]); 
}