C遍历char数组

时间:2020-05-04 23:04:28

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

#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语句有效,但是迭代存在缺陷。

没有错误消息。

2 个答案:

答案 0 :(得分:1)

if (strcmp(&a[i][j], "I") == 0)

应替换为

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

由于&a[i][j]不是正确的字符串(通常在末尾不包含'\0'),因此除非您很幸运,否则您永远不会获得匹配。在这种情况下,您9点9分就很幸运。

答案 1 :(得分: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] );
}