[英]Weird issue - dimensional array input in c
我编写了一个程序来检查方形n*n
矩阵是否“完美”,这意味着每一行和每一行都包含从 1 到n
的每个数字的一个实例。
我还编写了一个 main 函数来为给定大小分配内存并从用户那里接收该矩阵的值。
它似乎工作正常,除非我选择 4 作为大小并输入此矩阵: {{1,2,3,4},{2,1,4,3},{3,4,2,1),{4,3,1,2}}
。
我得到矩阵{{1,2,3,4},{2,**3**,4,3},{3,4,**3**,1},{4,3,1,2}}
。
它看起来像一个输入的东西,但我t find what
错了:(
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int IsPerfect(int *arr, int size);
void main() {
int size = 0, i = 0, j = 0, vol = 0;
printf("please enter matrix size, 0 to exit:\n");
scanf("%d", &size);
printf("size is :%d\n", size);
while (size != 0) { //loop for allocating and inputing ,matrix
int *pmatrix = (int *)malloc(size*size * sizeof(int));
printf("please input matrix:\n");
for (i = 0; i < size; i++)
for (j = 0; j < size; j++) {
printf("[%d][%d]\n", i, j);
scanf("%d", ((pmatrix + i) + j)); //storing matrix values
}
for (i = 0; i < size; i++) {
for (j = 0; j < size; j++)
printf("[%d]", *((pmatrix + i) + j)); //printing matrix
printf("\n");
}
IsPerfect(pmatrix, size); //perfect check
free(pmatrix);
printf("please enter matrix size, 0 to exit:\n");
scanf("%d", &size);
}
printf("bye bye!\n");
}
int IsPerfect(int *arr, int size) {
int i = 0, j = 0, w = 0, perf = 1;
int *check = (int *)malloc(sizeof(int) * size);
for (w = 0; w < size; w++) { //horizontal check
for (i = 0; i < size; i++)
*(check + i) = 0;
for (i = 0; i < size; i++)
for (j = 1; j <= size; j++)
if (*((arr + w) + i) == j)
*(check + j - 1) = *(check + j - 1) + 1;
for (i = 0; i < size; i++)
if (*(check + i) == 0 || *(check + i) > 1)
perf = 0;
}
for (w = 0; w < size; w++) { //vertical check
for (i = 0; i < size; i++)
*(check + i) = 0;
for (i = 0; i < size; i++)
for (j = 1; j <= size; j++)
if (*((arr + i) + w) == j)
*(check + j - 1) = *(check + j - 1) + 1;
for (i = 0; i < size; i++)
if (*(check + i) == 0 || *(check + i) > 1)
perf = 0;
}
if (perf == 1)
printf("the matrix is perfect\n");
if (perf == 0)
printf("the matrix is not perfect\n");
free(check);
return perf;
}
以下建议代码:
size_t
作为索引类型,因为这些值永远不应该小于 0 并且更好地匹配malloc()
函数的期望for ( size_t col = 1; col <= size; col++ )
将局部变量的scope
限制为封闭的for()
循环体check()
函数中的问题,同样,访问矩阵元素的方法不正确check()
函数中的问题是数组元素的寻址i
和j
以便更好地理解。 i ==> row
和j ==> col
注意:这个语句是代码中的典型问题:
if ( *(check + row) == 0 || *(check + row) > 1 )
因为check
是在[0] [0],从而当添加row
,其跨所述第一行IE [0] [0] ...索引[0] [3]。 不是代码需要做什么来检查矩阵的列
也许你的意思是:
if ( *(check + size*row + col) == 0 || *(check + size*row + col) > 1 )
这将索引 [0][col]... [3][col]
现在,建议的代码:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
int IsPerfect( int *arr, size_t size );
int main( void )
{
size_t size;
printf("please enter matrix size, 0 to exit:\n");
scanf("%zu", &size);
printf("size is :%zu\n", size);
while ( size != 0 )
{ //loop for allocating and inputing ,matrix
int *pmatrix = malloc( size*size * sizeof(int) );
if( ! pmatrix )
{
perror( "malloc failed" );
exit( EXIT_FAILURE );
}
printf( "please input matrix:\n" );
for ( size_t row = 0; row < size; row++)
{
for ( size_t col = 0; col < size; col++)
{
printf( "[%zu][%zu]\n", row, col );
if( scanf( "%d", &pmatrix[ (size*row) + col ]) != 1 ) //storing matrix values row by row
{
fprintf( stderr, "scanf for matrix entry failed\n" );
free( pmatrix );
exit( EXIT_FAILURE );
}
}
}
for ( size_t row = 0; row < size; row++)
{
for ( size_t col = 0; col < size; col++)
{
printf( "[%d]", pmatrix[ row*size + col ] ); //printing matrix
}
printf( "\n" );
}
IsPerfect( pmatrix, size ); //perfect check
free( pmatrix );
printf( "please enter matrix size, 0 to exit:\n" );
scanf( "%zu", &size );
}
printf( "bye bye!\n" );
}
int IsPerfect( int *arr, size_t size )
{
int perf = 1;
int *check = malloc( sizeof(int) * size );
if( !check )
{
perror( "malloc failed" );
exit( EXIT_FAILURE );
}
for ( size_t w = 0; w < size; w++ )
{ //horizontal check
for ( size_t row = 0; row < size; row++ )
{
*(check + row) = 0;
}
for ( size_t row = 0; row < size; row++ )
{
for ( size_t col = 1; col <= size; col++ )
{
if ( *((arr + w) + row) == (int)col )
{
*(check + col - 1) = *(check + col - 1) + 1;
}
}
}
for ( size_t row = 0; row < size; row++ )
{
if ( *(check + size*row) == 0 || *(check + size*row) > 1 )
{
perf = 0;
}
}
}
for ( size_t w = 0; w < size; w++ )
{ //vertical check
for ( size_t row = 0; row < size; row++ )
{
*(check + size*row) = 0;
}
for ( size_t w = 0; w < size; w++ )
{
for ( size_t col = 1; col <= size; col++ )
{
// why expect a position reference in the matrix to be the same as the content
if ( *((arr + size*col) + w) == (int)col )
{
*(check + col - 1) = *(check + col - 1) + 1; // causes seg fault
}
}
}
for ( size_t row = 0; row < size; row++ )
{
if ( *(check + row) == 0 || *(check + row) > 1 )
{
perf = 0;
}
}
}
if (perf == 1)
{
printf( "the matrix is perfect\n" );
}
else
{
printf( "the matrix is not perfect\n" );
}
free( check );
return perf;
}
注意:运行建议的代码并使用 OPs 数据,结果:
[1][2][3][4]
[2][1][4][3]
[3][4][2][1]
[4][3][1][2]
所以输入操作现在是正确的,但check()
函数仍然很远(并导致(大约)第 109 行上的段错误事件:
if ( *((arr + size*col) + w) == (int)col )
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.