#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语句有效,但是迭代存在缺陷。
没有错误消息。
答案 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] );
}