C Итерация по массиву символов - PullRequest
0 голосов
/ 05 мая 2020
#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», поскольку он выполняет итерацию по всем символам в массиве при сравнении, если текущий char равен «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» . Я действительно считаю, что проблема заключается в l oop, поскольку только выполняет работу на последнем. Это означает, что оператор if работает, но итерация ошибочна.

Сообщения об ошибках отсутствуют.

Ответы [ 2 ]

1 голос
/ 05 мая 2020

Для начала объявляйте переменные в минимальном объеме, в котором они используются.

Например, это объявление

int n, i, j, k;

только сбивает с толку читателей кода. Например, неясно видеть это объявление, где объявленная переменная n используется в коде, если она используется.

Во-вторых, не используйте magi c числа, например 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';
  }

Вы можете вывести массив проще, используя только один для l oop, например

for ( size_t i = 0; i < N; i++ )
{
    printf( ".*s\n", N, a[i] );
}
1 голос
/ 05 мая 2020
if (strcmp(&a[i][j], "I") == 0)

следует заменить на

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

Поскольку &a[i][j] не является правильной строкой (обычно не содержит '\0' в конце), вы никогда не получите совпадение, если вы повезло. В этом случае вам повезет на 9,9.

...