【问题标题】:How to display a character at a certain position in a 2d array?如何在二维数组中的某个位置显示一个字符?
【发布时间】:2017-01-14 19:27:32
【问题描述】:

我想澄清一下,是的,这是一个与作业相关的问题,不,我不希望你为我做作业。我喜欢编码,我只是在寻求建议。

话虽如此,我正在用 C 语言创建生命游戏。下面是一些代码来表明我一直在努力:

void create_area(void){
int table[24][80];
int i,j;
int xvalue=10,yvalue=10;
table[10][10] = 2;


/*for(j=0; j<24; j++){
    for(i=0; i<80; i++){
        table[j][i] = 1;
    }
}*/

for(j=0; j<24; j++){
    for(i=0; i<80; i++){
        printf(" ",table[j][i]);
    }
    printf("\n");
}

/*if(xvalue=10){
    if(yvalue=10){
        printf("O", table[xvalue][yvalue]);
    }
}*/

/*for(j=0; j<24; j++){
    for(i=0; i<80; i++){
        if(xvalue=0){
            if(yvalue=0){
                printf("O",table[xvalue][yvalue]);
            }
        }
    }
}*/
}

这里没有显示我的主要方法,但它负责查找参数的数量和参数字符串,并将它们放入我制作的两个数组(一个 x_array 和 y_array)的坐标中。上面显示的方法基本上是在终端中创建网格。 create_area 的参数现在是无效的(因为我只想测试值以查看它是否有效,这就是为什么我有两个 int 变量:xvalue 和 yvalue)。但想法是 create_area 将采用 x 值和 y 值并初始化单元格开始的字符“O”。很多代码都被注释掉了,因为我想弄清楚。

我的问题:如何在我的二维数组中插入一个字符,以便在终端中查看该字符时在网格上的某个位置显示该字符?

到目前为止,我创建了我的二维数组,并使用了两个 for 循环来遍历它并打印空格。但我试图弄清楚如何在表 [10] [10] 上打印一个字符。我尝试了一些东西,但角色不会显示在特定位置,只会显示在屏幕的左下方。我想我错过了一些简单的东西。

任何帮助将不胜感激。

【问题讨论】:

  • 对不起,你想在printf 的循环中做什么?你确定它会输出一些可见的字符吗?
  • 我不清楚您是否没有得到您期望的打印结果,或者您是否正在寻找一种在屏幕上特定位置打印某些内容的方法
  • @Christophe 后者,我正在寻找一种在终端上打印特定位置的方法。我制作了一个 80x24 的数组,并使用了两个 for 循环,使每个 table[j][i] 成为一个空格,所以基本上我的终端中有一个“不可见”的地图,就像一个矩形,我想把一个字符放在某个该地图中的位置。
  • 许多专业软件门都有严格的代码格式准则。通常在比较运算符周围、逗号之后、for 循环中的分号之后以及 C 中的 = 周围都有空格。当所有内容都挤在一起时,它会更难阅读,也更俗气。空白提供了分离,使事物更容易同化。如果您想以一种真正有帮助的方式减少空格,那么您的格式化风格就很好,就像您支撑事物的方式一样。新行上的大括号(有些人认为这是一个极端)需要滚动太多来阅读代码。
  • "printf(" ", table[j][i]);" 这是一个严重的代码问题,如果您启用编译器警告 (gcc: -Wall -Werror -Wextra -pedantic-errors) 您会发现并修复许多关键问题,您编写的代码会更安全、更安全符合标准。

标签: c


【解决方案1】:

如果你想表示一个字符网格,那么你应该使用数据类型char而不是int和字符常量(例如'1')而不是整数常量(例如1)。然而,主要问题是语句 printf(" ",table[j][i]); 总是打印一个空格,因为您错过了格式字符串中的格式说明符(例如,"%d" 表示整数,"%c" 表示字符数据类型)。 我不知道你的网格应该是什么样子,但也许下面的片段会有所帮助:

void create_area(void){
  char table[24][80];
  int i,j;
  int xvalue=10,yvalue=10;

  for(j=0; j<24; j++){
    for(i=0; i<80; i++){
        table[j][i] = '1';
    }
  }

  table[10][10] = '0';

  for(j=0; j<24; j++){
    for(i=0; i<80; i++){
        printf("%c",table[j][i]);
    }
    printf("\n");
  }
  ...

【讨论】:

  • 这正是我想要的,但是斯蒂芬,我使用 int 表而不是 char 的原因是因为当我在终端中运行我的程序时,例如:./gameoflife 1 2 3 4 我正在使用 argv,在这种情况下是 4 个字符串(1 2 3 4),我将它们配对为坐标,例如(1,2)和(3,4),我想成为能够使用我的坐标在网格上放置一个角色,你明白吗?
  • 坐标可能仍然是整数(在上面的代码中坐标也是整数,而存储在特定坐标处的值是字符)。因此,将 argv 值读入整数坐标是可以的,并且不需要该表是具有数据类型 int 的单元格的二维数组。请注意,在char table[24][80] 中,数组维度2480 是整数,而char 定义了单元格的数据类型。好吗?
  • 是的,@Inline 让我意识到这一点,我不敢相信我错过了这一点
【解决方案2】:

我同意这里的其他答案,但让我提供另一种观点。

您应该将 datapresentation 分开。这里的数组是你的数据(它也可以是bool table[24][80],因为在生命游戏中每个单元格都用 1 位来描述)。显示数据的代码应检查每个数据元素(查看它是 0 还是 1)并输出 1 char。为此,您可以使用putchar

putchar(table[j][i] ? 'x' : ' ')

printf:

printf("%c", table[j][i] ? 'x' : ' ')

最好将数据与演示分开,因为这样可以更轻松地分别更改(改进)它们中的每一个。例如,如果您决定在可视化中将 x 替换为 *,则相应的代码在一个位置。如果您决定通过为每个单元分配 1 个字节(而不是每个单元 1 个 int)来优化存储 - 更改也相对局部化。

【讨论】:

    【解决方案3】:

    用于选项。你实际上可以用空格填充你的table,修改它然后打印

    char table[24][80]; // char is better
    
    memset(table, ' ', sizeof(table[0][0]) * 24 * 80); // Fill table with spaces
    
    table[10][10] = 'J'; // Your first custom char
    table[20][20] = '0'; // Another custom char
    
    for(j=0; j<24; ++j) {
        for(i=0; i<80; ++i) {
            printf("%c",table[j][i]); // You forget write "%c" to print char
            //putchar(table[j][i]) // This will also work
        }
        printf("\n");
    }
    

    【讨论】:

    • 由于我的 2d 数组是 int 类型的,这不能正常工作,因为你做了 table[10][10] = 'J'
    • @DsDude 首先你不需要二维整数数组,你需要字符。
    • 我明白你在说什么,我赞成你的评论,它很有见地。但是请阅读我对 Stephan Lechner 帖子的评论,因为我使用 int 表而不是 char 表是有原因的。
    • @DsDude 我不明白,对于数组索引 C 使用 size_t 并且它不依赖于数据类型。所以你可以使用size_tint 坐标/索引为char table[n][m]
    • @DsDude 为了更好地索引使用 size_t (它是无符号和标准的)stackoverflow.com/questions/32325479/…
    【解决方案4】:

    查看printf 的说明。在 C 中,character 只是一个整数,所以你应该指定一个格式来输出它,就像一个字符 %c 或一个整数(十进制)%d

       for(j=0; j<24; j++) {
    
            for(i=0; i<80; i++){
    
                if (table[j][i] == 1) { // it's a code of some character that fills your array (As I saw in commented block you used 1)
                    printf(" ");
                } else {
                    printf("%c",table[j][i]);
                }
            }
    
            printf("\n");
        }
    

    附:对于profi,我知道这不是最佳代码,但他很容易理解。

    【讨论】:

      【解决方案5】:

      您可以使用%hhu扫码打印unsigned char。这意味着无需更改您的 int table 数据类型。

      printf("%hhu", table[j][i]); % table[j][i] contains integers
      

      提示:unsigned char 的范围是0 - 255,并且不在此范围内的数字将不会像您预期的那样显示。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-01-06
        • 2011-02-12
        • 1970-01-01
        • 2011-08-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-25
        相关资源
        最近更新 更多