【问题标题】:Handling arrays in C在 C 中处理数组
【发布时间】:2020-03-11 19:29:43
【问题描述】:

我只是 C 语言的初学者。

我想确定数组的元素,但它失败了。 我想插入索引(行=x,列=y)。这可能吗?

这是我的代码。

#include <stdio.h>
#define _CRT_SECURE_NO_WARNINGS

int main(void)
{
    int x, y;
    char coords[3][3] = { NULL };

    printf("x, y: ");
    scanf("%d %d", &x, &y);


    coords[x][y] = 'O';




    for (int i = 0; i < 3; i++)
    {
        for (int j = 0; j < 3; j++)
            printf("%c ", coords[i][j]);
        printf("\n");
    }

    return 0;
}

如果 x=2, y=2,我希望结果会被打印出来

␠␠␠
␠␠␠
␠␠O

(其中␠是空格)

我认为coords[x][y] = 'O'; 是问题所在,但我无法解决。

【问题讨论】:

  • 为什么你认为应该打印“\n”?你printf("\\n")在哪里吗?代码现在打印的是什么?你的初始化有点奇怪,NULL 是一个指针的值。要将数组元素初始化为0,请执行= { { 0 } };。 “未显式初始化”的数组元素将自动初始化为 0。
  • NULL in char coords[3][3] = { NULL }; 没有意义。在我的编译器上,它最终用 NUL(字符零)填充数组。绝对没有理由相信它会像您期望的那样用空格填充它!
  • 重新编辑,如果您只想要一个,为什么要为每个数组元素打印两个字符 ("%c ")...
  • 除非您检查返回,否则您无法正确使用scanf。例如。 if (scanf("%d %d", &amp;x, &amp;y) != 2) { fputs ("error: invalid integer input.\n", stderr; return 1; }启用编译器警告 - 对于 VS,将 /W3 添加到您的编译器选项中,并且在编译没有警告之前不要接受代码。

标签: c arrays indexing


【解决方案1】:

第一:

char coords[3][3] = { NULL };

NULL 在这里没什么意义,尽管编译器很可能会编译代码并将所有元素初始化为零。让我们把它改成更“正确”的东西:

char coords[3][3] = { { 0 } };

未显式初始化的数组元素被初始化为0。作为参考,您可以阅读array initialization on cppreference

现在我们知道所有的数组元素都是用0 初始化的。所以您可以在打印前检查它们:

for (int i = 0; i < 3; i++) {
    for (int j = 0; j < 3; j++) {
        if (coords[i][j] == 0) {
            printf(" ");
        } else {
            printf("%c", coords[i][j]);
        }
        printf(" ");
    }
    printf("\n");
}

或者,您可以按照其他答案中的建议将所有数组元素初始化为 ' ' 字符。

【讨论】:

    【解决方案2】:

    您可能没有像您想象的那样初始化您的coords 数组!行:

    char coords[3][3] = { NULL };
    

    实际上给所有 9 个元素的值 zero - 这是nul(不可打印)字符。 (如果列表中的初始值设定项少于数组元素,则所有“额外”元素的值都将为零。)

    您可能想要的(将所有 9 个元素设置为空白)是:

    char coords[3][3] = { {' ', ' ', ' '}, {' ', ' ', ' '}, {' ', ' ', ' '} };
    

    或类似的东西,例如,如果您知道您的系统使用ASCII 编码(它不是强制),则使用ASCII 值作为空格(32)。

    最好将所需的初始值定义为常量,然后将其用作初始化器:

    const char X = ' ';
    char coords[3][3] = { {X, X, X}, {X, X, X}, {X, X, X} };
    

    因为如果您需要使用不同的初始字符,这样可以更轻松地更改内容(减少输入)。

    【讨论】:

      猜你喜欢
      • 2010-12-25
      • 1970-01-01
      • 1970-01-01
      • 2010-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-13
      • 1970-01-01
      相关资源
      最近更新 更多