【问题标题】:C Iterating through char arrayC遍历char数组
【发布时间】:2020-08-19 12:28:36
【问题描述】:
#include <stdio.h>
#include <string.h>


int main(void) 
{
  int n, i, j, k;
  char a[10][10];
  for (i = 0; i<10; i++)
  {
    for (j = 0; j<10; j++)
    {
      scanf(" %c", &a[i][j]);
    }
  }

  for (i = 0; i<10; i++)
  {
    for (j = 0; j<10; j++)
    {
      if (strcmp(&a[i][j], "I") == 0)
      {
        a[i][j] = 'H';
      }
    }
  }

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


  return 0;

此代码应该将所有行中的所有“I”更改为“H”,因为它在比较当前字符是否为“I”时遍历数组中的所有字符。 它的示例输入和预期输出将是:

--IHH---I-
-H--------
----------
----H-----
----IH----
----H-----
----H-----
-H--------
---------I
-HI--H---I


--HHH---H-
-H--------
----------
----H-----
----HH----
----H-----
----H-----
-H--------
---------H
-HH--H---H

但真正的输出是;

--IHH---I-
-H--------
----------
----H-----
----IH----
----H-----
----H-----
-H--------
---------I
-HI--H---H

我们可以看到只有第 9x9 个“I”变为“H”。我确实相信问题出在 for 循环中,因为它在最后一个循环中完成了这项工作。这意味着 if 语句有效,但迭代存在缺陷。

没有错误消息。

【问题讨论】:

  • 不要在不是字符串的东西上使用strcmp。直接比较字符:a[i][j] == 'H'。 strcmp 需要一个以 NUL 结尾的字符串。你没有。

标签: c for-loop if-statement char printf


【解决方案1】:

首先,在使用它们的最小范围内声明变量。

例如这个声明

int n, i, j, k;

只会让代码的读者感到困惑。例如,如果使用了声明的变量n,则不清楚在代码中使用该声明的位置。

其次,不要使用像 10 这样的幻数。而是使用命名常量。

例如,数组可以声明为。

enum { N = 10 };
char a[N][N];

例如,你可以在循环中编写

for ( size_t i = 0; i < N; i++ )
{
    for ( size_t j = 0; j < N; j++ )
    {
        scanf( " %c", &a[i][j] );
    }
}

您的数组似乎不包含字符串。

所以if语句中的条件

  if (strcmp(&a[i][j], "I") == 0)
  {
    a[i][j] = 'H';
  }

也是无效的,因为您将只检查带有字符 'I' 的数组的一个字符,而不是带有字符串文字 "I" 的数组的子数组。

改写如下语句

  if ( a[i][j] == 'I' )
  {
    a[i][j] = 'H';
  }

您可以只使用一个 for 循环来更简单地输出数组

for ( size_t i = 0; i < N; i++ )
{
    printf( ".*s\n", N, a[i] );
}

【讨论】:

    【解决方案2】:
    if (strcmp(&a[i][j], "I") == 0)
    

    应该替换为

    if (a[i][j]=='I')
    

    由于&amp;a[i][j] 不是一个正确的字符串(通常不包含'\0' 在末尾),所以除非你很幸运,否则你永远不会得到匹配。在这种情况下,您在 9,9 时很幸运。

    【讨论】:

    • 而且由于数组在内存中是连续的——唯一可以让你“幸运”的字符是最后一行中的最后一个字符:)
    猜你喜欢
    • 2018-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-02
    • 2013-03-22
    • 2011-01-25
    • 1970-01-01
    相关资源
    最近更新 更多