所以我试图动态生成一个框,基于我在box_ascii.h
中定义的一些ascii字符。我只是想测试我的逻辑,当我进入我的for循环时,我得到一个错误:
$ make create_dynamic_box
cc create_dynamic_box.c -o create_dynamic_box
create_dynamic_box.c:26:30: error: expected expression
printf("%c", BOX_TOP_LEFT_CORNER);
^
./box_ascii.h:6:41: note: expanded from macro 'BOX_TOP_LEFT_CORNER'
#define BOX_TOP_LEFT_CORNER = "\214" // ╓
我对谷歌的错误研究通常意味着我需要像int b = a
这样的东西,它基本上告诉我某些东西没有类型或类型错误(?)
代码的任何方式:
box_ascii.h
#ifndef __box_ascii_h__
#define __box_ascii_h__
// Might not be exact Ascii Characters but they come from:
// http://www.asciitable.com/
#define BOX_TOP_LEFT_CORNER = "\214" // ╓
#define BOX_TOP_RIGHT_CORNER = "\187" // ╖
#define BOX_BOTTOM_LEFT_CORNER = "\200" // ╚
#define BOX_BOTTOM_RIGHT_CORNER = "\188" // ╛
#define BOX_SIDE = "\186" // ║
#define BOX_TOP_BOTTOM = "\205" // ═
#endif
create_dynamic_box.c
#include <stdio.h>
#include <stdlib.h>
#include "box_ascii.h"
void print_border(int width, int height);
int main(int argc, char *argv[]) {
if(argc < 3) {
printf("Mustenter width and height.");
return -1;
}
print_border(atoi(argv[1]), atoi(argv[2]));
return 0;
}
void print_border(int width, int height) {
int row = 0;
int col = 0;
for (row = 0; row < width; row ++) {
for (col = 0; col < height; col++) {
if (row == 0 && col == 0) {
printf("%c", BOX_TOP_LEFT_CORNER); // error thrown here.
}
}
}
}
怎么回事?是因为我使用%c
??
答案 0 :(得分:2)
出现错误消息是因为宏执行文本替换 - 它们不是命名值。
所以
#define BOX_TOP_LEFT_CORNER = "\214"
printf("%c", BOX_TOP_LEFT_CORNER);
将被编译器视为
printf("%c", = "\214");
这有两个问题。首先,=
是错误的。其次,%c
会导致printf()
期望单个字符,而"\214"
是包含两个字符的数组('\214'
和'\0'
)。
因此,需要从宏中移除=
符号。
如果要使用%c
格式,请将宏定义更改为使用单引号字符('
)
#define BOX_TOP_LEFT_CORNER '\214'
如果您希望宏是多字符字符串,请使用%s
格式。
无论哪种方式,都不要提供预期单个字符的字符串,反之亦然。
另外:像\214
这样的字符是扩展的ASCII(定义不明确)而不是ASCII。
答案 1 :(得分:0)
您的BOX_ *宏定义字符串,而不是字符。他们应该是:
#define BOX_TOP_LEFT_CORNER '\214' //
其他宏的等等。
在C中,`\ xyz&#39;定义一个八进制代码为 xyz 的字符。
参考here.