【问题标题】:How do i print an array with multiple data types如何打印具有多种数据类型的数组
【发布时间】:2021-04-25 16:48:12
【问题描述】:

我的学校作业指出以下我需要创建一个具有 2 个数据类型 (Char,Int) 的 typedef 结构,为其创建 4 个元素,将这些值放入一个数组并打印该数组。我可以管理它直到创建数组。之后我就有点烦了,

#include <stdio.h>

typedef struct {
    char *Series;
    char KiloWatts;
    int  Age;
} Data_T;

int main(){
     Data_T Motor[4] = {{"B", 3, 2004},{"T", 5, 2005},{"B", 3, 2004},{"A", 2, 2002}}; 
     int i;

     for (i=0; i<4;i++)
         printf("%n", Motor[i]); 
     }

     return 0;
}

我知道 printf 现在无法正常工作,所以是否有功能可以执行此操作,还是我需要手动写下所有内容?

【问题讨论】:

  • 您需要单独打印每个成员或将其委托给执行此操作的函数。

标签: c struct


【解决方案1】:

您需要自己完成这项工作。一种选择是:

 for (i=0; i<4;i++)
     printf("%s %c %d", Motor[i].Series, Motor[i].KiloWatts, Motor[i].Age); 
 }

但是,这种方法可能非常有用:

void Motor2String(char *dest, Data_T motor) {
    sprintf(dest, "%s %c %d", motor.Series, motor.KiloWatts, motor.Age);
}

只是为了澄清。您的数组没有多种数据类型。这甚至是不允许的。你所拥有的是一个数组,其中每个元素的类型都是Data_T

【讨论】:

    【解决方案2】:

    与其他语言不同,例如带有cout 的C++ 和带有print 的Python,C 没有通用的“打印此”函数,它知道如何打印所有内容(一旦实现了适当的实例方法)。所以,是的,您必须手动打印每个字段。

    当然,您可以轻松地为此设置一个函数。例如,

    void
    print_data(const Data_t *data)
    {
        printf("%s, %c, %i\n", data->Series, data->KiloWatts, data->Age);
    }
    

    【讨论】:

    • 很好的答案,只有一个注释,所以您不会被破坏,在C++ 中,您基本上也是手动打印它,但会覆盖输出运算符。如果这确实有意义,IDK python 是如何做到的。
    • 好点。 Python 也是如此。我的意思是每个对象都被告知如何打印自己,然后你就不用担心了。回到我的电脑后,我会更新我的答案。
    【解决方案3】:

    您可以通过一种方法,使用它在 Linux 内核中的完成方式,其中有专用的 *_ops 结构来对主要的 struct 进行操作。这些ops 结构具有指向函数的函数指针,这些函数接受指向该结构的指针。文件操作的一个例子是here。正如 LWN article 所解释的那样,这显然是更面向对象的方式,但如果这种设计有意义,则由您选择。

    所以对于这种情况,这样的事情可能会起作用:

    #include <stdio.h>
    
    struct Data;
    
    typedef  struct {
        void (*print)(struct Data const* ptr);
    }Data_T_ops;
    
    typedef struct Data{
        char *Series;
        char KiloWatts;
        int  Age;
        Data_T_ops const* ops;
    }Data_T;
    
    void print_Data_T(Data_T const* ptr) {
        if(ptr) {
            printf("KW: %s\n", ptr->Series);
            printf("%d\n", ptr->Age);
        }
    }
    
    static Data_T_ops const data_t_ops = {
        .print = print_Data_T,
    };
    
    int main(){
         Data_T Motor[4] = {
             {"B", 3, 2004, &data_t_ops},
             {"T", 5, 2005, &data_t_ops},
             {"B", 3, 2004, &data_t_ops},
             {"A", 2, 2002, &data_t_ops},
        }; 
         int i;
         for (i=0; i<4;i++)
             Motor[i].ops->print(&Motor[i]);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-28
      • 1970-01-01
      • 2013-08-04
      • 1970-01-01
      • 2021-01-17
      • 1970-01-01
      • 1970-01-01
      • 2020-07-18
      相关资源
      最近更新 更多