试图在C中打印ascii表示

时间:2015-04-10 22:32:04

标签: c

所以我试图动态生成一个框,基于我在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 ??

2 个答案:

答案 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.