【问题标题】:How to count occurrences of specific char in 2D array in C language?如何计算 C 语言中二维数组中特定字符的出现次数?
【发布时间】:2021-12-10 13:49:50
【问题描述】:

我有一个数组 [8][8]

char d[ROWS][COLS] = {
        {0, 2, 0, 2, 0, 2, 0, 2},
        {2, 0, 2, 0, 2, 0, 2, 0},
        {0, 2, 0, 2, 0, 2, 0, 2},
        {1, 0, 1, 0, 1, 0, 1, 0},
        {0, 1, 0, 1, 0, 1, 0, 1},
        {3, 0, 3, 0, 3, 0, 3, 0},
        {0, 3, 0, 3, 0, 3, 0, 3},
        {3, 0, 3, 0, 3, 0, 3, 0}};


int countOccurrences(char d[ROWS][COLS], int i, int j, int res)
{
    res = 0;
    for (i=0; i<=ROWS; i++){
        for(j=0; j<=COLS; j++){
            if ('2' == d[ROWS][COLS])
            res++;
            
        }
    }      
    return res;
    printf("score%d", res);

} 

我的代码不起作用,我需要查找并计算二维数组中的出现次数并将其打印出来

【问题讨论】:

  • 数组从索引 0 开始,到索引“size-1”结束。因此i=0; i&lt;=ROWS; 没有任何意义,你访问的数组越界。
  • shrib.com/#Mara4rMnyRK 这是我的代码,我做了你建议我的更改,但不知何故它返回了疯狂的数字,我会感谢你的帮助)无论如何它不是为了学校或任何试图学习的东西,你能请简要检查我的代码并告诉我为什么它不能正常工作?
  • 如果您在实施已发布答案中的建议后仍有问题,那么您可以提出一个新问题并将代码发布到那里。

标签: arrays c 2d


【解决方案1】:

我发表了评论,但我也会继续使用固定功能做出回应。我将指出代码中的三个主要问题:

  1. 在您的代码中,数组中有数字,但随后您尝试将字符与数字进行比较('2' == 2 为假),这意味着您的结果将全部为 0
  2. 打印语句return之后,这意味着它实际上不会运行。
  3. if 语句if (2 == d[ROWS][COLS])总是检查位置ROWSCOLS 的数字。第一个问题是ROWSCOLS 没有改变位置,这是一个常数;你想检查ij的位置。其次,由于 C 中的数组是从零开始的,因此在位置 [ROWS][COLS] 访问 d 实际上会指向一些未知的内存空间,因为这超出了数组的范围,但这只是一个有趣的事实。

下面的代码应该可以解决我上面指出的问题:

char d[ROWS][COLS] = {
    {0, 2, 0, 2, 0, 2, 0, 2},
    {2, 0, 2, 0, 2, 0, 2, 0},
    {0, 2, 0, 2, 0, 2, 0, 2},
    {1, 0, 1, 0, 1, 0, 1, 0},
    {0, 1, 0, 1, 0, 1, 0, 1},
    {3, 0, 3, 0, 3, 0, 3, 0},
    {0, 3, 0, 3, 0, 3, 0, 3},
    {3, 0, 3, 0, 3, 0, 3, 0}};

int countOccurrences(char d[ROWS][COLS], int i, int j, int res) {
    res = 0;

    // NOTICE that it is now i < ROWS and j < COLS instead of
    // i <= ROWS and j <= COLS to deal with what I mentioned
    // before about the zero-based indexing in C, which means
    // we need to stop BEFORE ROWS and COLS
    for (i = 0; i < ROWS; i++) {
        for (j = 0; j < COLS; j++) {
            if (2 == d[i][j])
                res++;
        }
    }      

    printf("score%d", res);
    return res;
}

【讨论】:

  • i&lt;=ROWSj&lt;=COLS(来自原始代码)仍然存在问题 - 这将导致 d[i][j] 超出数组边界。
  • 正确 @sj95126 -- 我修复了代码以正确对应。
【解决方案2】:

您的代码存在一些问题:

  • 您有一个字符'2',它将转换为您的系统使用的任何字符编码,在我的例子中,ASCII 将由值50 保存,您将它与值@987654324 进行比较@,它将返回 false
  • 您每次都在比较 d[ROWS][COLS],这可能不是您想要的。
  • 在您的循环中,有时它会尝试访问d[ROW][...]d[...][COL],这会产生越界错误。
  • 你为你的函数做了太多不必要的参数。
  • 你在printf()之前是return,所以printf()永远不会被处决。

建议代码:

char d[ROWS][COLS] = {
        {'0', '2', '0', '2', '0', '2', '0', '2'},
        {'2', '0', '2', '0', '2', '0', '2', '0'},
        {'0', '2', '0', '2', '0', '2', '0', '2'},
        {'1', '0', '1', '0', '1', '0', '1', '0'},
        {'0', '1', '0', '1', '0', '1', '0', '1'},
        {'3', '0', '3', '0', '3', '0', '3', '0'},
        {'0', '3', '0', '3', '0', '3', '0', '3'},
        {'3', '0', '3', '0', '3', '0', '3', '0'}};


int countOccurrences(char anotherName[], int ROWS, int COLS)
{
    int res = 0;
    for (int i=0; i<ROWS; i++){
        for(int j=0; j<COLS; j++){
            if ('2' == anotherName[i][j])
            ++res;
            
        }
    }      
    printf("score%d", res);
    return res;
} 
// You should call it like this: int something = countOccurrences(d, ROWS, COLS);

【讨论】:

  • 我会小心地假设 C99 专门用于在 for 循环中声明变量 ij
  • @charlie-map 我已经编辑了我的代码,感谢您的建议。
  • @charlie-map 因此,我们的政策是,除非问题中明确提及特定的旧标准,否则我们可以采用当前标准。这是C17。因此,您的建议是有害的,并且编辑使代码变得更糟。
  • shrib.com/#Mara4rMnyRK 这是我的代码,我做了你建议我的改变,但不知何故它返回了疯狂的数字,我会感谢你的帮助)无论如何它不是为了学校或任何试图学习的东西,您能否简要检查一下我的代码并告诉我为什么它不能正常工作?
  • @HazelHochmann 我的代码修复了你的错误吗?
猜你喜欢
  • 1970-01-01
  • 2021-09-02
  • 2023-04-02
  • 1970-01-01
  • 2015-06-30
  • 2022-01-07
  • 1970-01-01
  • 2020-09-23
  • 1970-01-01
相关资源
最近更新 更多