使用C从给定数据库文件中仅打印x y z中的x坐标

时间:2014-08-12 00:50:41

标签: c

我想打印我的输出,其中只打印出x坐标。

      1.  printf("sphere{\n");
      2.  printf("\t<%g %g %g>,\n", V3ARGS(ell->v));
      3.  printf("//<\n %g \n// %g %g>\n }", V3ARGS(ell->a));

在第三行代码中,在第一个变量之后我放了'//',因为它是注释的标志,即我在输出文件中将第二个和第三个变量打印为注释。 有什么方法可以打印出'x'值,即第一个变量?

2 个答案:

答案 0 :(得分:1)

以下是一些可以代表您正在使用的代码的代码,以及一次提取一个参数的宏:

#include <stdio.h>

#define V3ARGS(v)   (v).x, (v).y, (v).z
#define ARG_1(x, y, z)   (x)
#define ARG_2(x, y, z)   (y)
#define ARG_3(x, y, z)   (z)
#define ARG1(v)   ARG_1(v)
#define ARG2(v)   ARG_2(v)
#define ARG3(v)   ARG_3(v)


typedef struct Point_3D
{
    double x;
    double y;
    double z;
} Point_3D;;

typedef struct DoublePoint
{
    Point_3D    a;
    Point_3D    v;
} DoublePoint;

int main(void)
{
    DoublePoint d = { { 1.1, 2.2, 3.3 }, { 4.4, 5.5, 6.6 } };
    DoublePoint *ell = &d;
    printf("sphere{\n");
    printf("\t<%g %g %g>,\n", V3ARGS(ell->v));
    printf("//<\n %g \n// %g %g>\n }\n", V3ARGS(ell->a));
    printf("a.x = %g\n", ARG1(V3ARGS(ell->a)));
    printf("a.y = %g\n", ARG2(V3ARGS(ell->a)));
    printf("a.z = %g\n", ARG3(V3ARGS(ell->a)));
    printf("v.x = %g\n", ARG1(V3ARGS(ell->v)));
    printf("v.y = %g\n", ARG2(V3ARGS(ell->v)));
    printf("v.z = %g\n", ARG3(V3ARGS(ell->v)));
    return 0;
}

这里的诀窍是两个级别的宏ARG1ARG_1。请注意,ARG1()只接受一个参数,期望是V3ARGS的调用,然后调用ARG_1()。这个技巧将宏参数扩展为ARG_1()所期望的三个以逗号分隔的参数,然后“返回”这些参数中的第一个。

显示的代码的输出(其中第一个输出是您在问题中显示的代码,在输出结尾处有换行符):

sphere{
    <4.4 5.5 6.6>,
//<
 1.1 
// 2.2 3.3>
 }
a.x = 1.1
a.y = 2.2
a.z = 3.3
v.x = 4.4
v.y = 5.5
v.z = 6.6

答案 1 :(得分:0)

正如@JonathanLeffler指出的那样,无论你的V3ARGS(...)是什么,它都可能是#define宏,它会解析为逗号列表,如x, y, z。这意味着如果你说:

,你实际上是在询问格式字符串只打印x
printf("some format string here", x, y, z);

您很幸运,因为碰巧传递更少的格式说明符比传递参数更合法:

Passing too many arguments to printf

因此,如果您只想要第一个参数,那么只使用一个说明符:

printf("%g", x, y, z);

如果您只想要第二个,或者仅仅是第三个,那就变得更加棘手。因为没有一般的跳过值的方法;格式说明符按顺序使用(尽管有一个POSIX扩展名可以按编号访问):

Is there a "null" printf code that doesn't print anything, used to skip a parameter?

因此,如果您遇到这样的情况并想要打印z,并且无法修改宏,那么should work in ANSI C99

typedef struct {
   double x,
   double y,
   double z
} Coordinate;

Coordinate temp;
temp = (Coordinate){ V3ARGS(ell->a) };

printf("%g", temp.z);

这利用了这样一个事实,即结构字段可以通过该分配方式的逗号分隔列表进行初始化。

但是通过查看V3ARGS的定义可能会更好。因为它可能会做类似的事情:

#define V3ARGS(foo) (foo).x, (foo).y, (foo).z

在这种情况下你可以说:

printf("%g", ell->a.z);