我创建了这个程序,扫描2D数组中的垂直和水平对,其中row = 20和column = 30,然后显示输出。
我想我可能在功能2&中搞砸了我的逻辑。 3.任何人都可以帮我查一下,帮我弄清楚我做错了吗? 我会非常感激。
完整的程序代码:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define ROW 20
#define COLUMN 30
void intro_msg (void);
char function1 (char [ROW] [COLUMN]);
char function2 (char [ROW] [COLUMN]);
char function3 (char [ROW] [COLUMN]);
void function4 (int , int);
void goodbye_msg (void);
int main( void )
{ // MARKS THE BEGINNING OF THE main( ) BLOCK OF STATEMENTS
char randchar_array [ROW] [COLUMN];
int hor_pairs = 0 , vert_pairs = 0;
srandom ( (unsigned) time (NULL) );
intro_msg ( ) ;
function1 (randchar_array);
hor_pairs = function2 (randchar_array);
vert_pairs = function3 (randchar_array);
function4 (hor_pairs , vert_pairs);
goodbye_msg ( ) ;
return ( 0 ) ;
} // MARKS THE END OF THE main( ) BLOCK OF STATEMENTS
void intro_msg (void)
{
printf( "\n Welcome user, this program creates a 2D array of characters "
"that has 20 rows\n and 30 columns and then populates it with random"
" characters. The program then\n displays the number of vertical "
"and horizontal pairs in the array.\n\n");
return ;
}
char function1 (char randchar_array[ROW] [COLUMN])
{
int r = 0 ;
int c = 0 ;
char nextchar = 'A';
for (r = 0; r < ROW ; r++)
{
for (c = 0; c < COLUMN ; c++)
{
nextchar = 'A' + random() % 26;
randchar_array [r] [c] = nextchar;
printf(" %c", nextchar);
}
printf("\n");
}
return (randchar_array [ROW] [COLUMN]);
}
char function2 (char randchar_array[ROW] [COLUMN])
{
int r = 0 ;
int c = 0 ;
int horpairs = 0;
for (r = 0; r < ROW -1; r++)
{
for (c = 0; c < COLUMN ; c++)
{
{
if(randchar_array[r][c] == randchar_array[r][c+1])
horpairs++;
}
}
}
return (horpairs);
}
char function3 (char randchar_array[ROW] [COLUMN])
{
int r = 0 ;
int c = 0 ;
int vertpairs = 0;
for (r = 0; r < ROW ; r++)
{
for (c = 0; c < COLUMN -1; c++)
{
{
if(randchar_array[r][c] == randchar_array[r+1][c])
vertpairs++;
}
}
}
return (vertpairs);
}
void function4 (int hor_pairs, int vert_pairs)
{
printf ( " \n Number of horizontal pairs: %d /n" , hor_pairs );
printf ( " \n Number of vertical pairs: %d /n" , vert_pairs );
return ;
}
void goodbye_msg (void)
{
printf ( "\n Thank you for using this program.\n\n") ;
return ;
}
答案 0 :(得分:2)
for (r = 0; r < ROW -1; r++)
{
for (c = 0; c < COLUMN ; c++)
{
if(randchar_array[r][c] == randchar_array[r][c+1])
horpairs++;
}
}
循环条件中的 ROW-1
和循环体中的c+1
将产生一个Array-out-of-bounds Exception。要么COLUMN-1
而不是ROW-1
,要么r+1
而不是c+1
。
function2()
和function3()
共享该问题。我想你想要:
char function2 (char randchar_array[ROW] [COLUMN]) {
int r = 0 ;
int c = 0 ;
int horpairs = 0;
for (r = 0; r < ROW ; r++){
for (c = 0; c < COLUMN-1 ; c++){
if(randchar_array[r][c] == randchar_array[r][c+1])
horpairs++;
}
}
return (horpairs);
}
char function3 (char randchar_array[ROW] [COLUMN]) {
int r = 0 ;
int c = 0 ;
int vertpairs = 0;
for (r = 0; r < ROW -1; r++){
for (c = 0; c < COLUMN ; c++){
if(randchar_array[r][c] == randchar_array[r+1][c])
vertpairs++;
}
}
return (vertpairs);
}
答案 1 :(得分:2)
你犯了同样的错误两次:
for (c = 0; c < COLUMN ; c++)
{
if(randchar_array[r][c] == randchar_array[r][c+1])
在这里,并且:
for (r = 0; r < ROW ; r++)
{
for (c = 0; c < COLUMN -1; c++)
{
if(randchar_array[r][c] == randchar_array[r+1][c])
你for
循环遍历char数组的所有元素,其中c
和r
将分别增加到COLUMN -1
和ROW -1
。但是在上述循环中,您在c
语句的右侧操作数中将r
或if
递增1。
你的循环最后一次运行,这意味着你实际上已经超出界限,并且访问(或者试图访问):
randchar_array[r][COLUMN]
//and
randchar_array[ROW][c]
这是错误的。将您的循环更改为:
for(c = 0;c < COLUMN -1;++c)
或者,对于更加微观优化的方式
for(c = COLUMN - 1;c > 0; --c)
当然,后一个循环将字符重复到前面,所以你必须考虑到这一点。
请注意,在最后一个循环(for(c = COLUMN - 1;c > 0; --c)
)中,c
将不会达到0,但这是因为它不需要,因为,当c = 1
时,您将它与{ {1}}无论如何......
您的代码可能最终看起来像:
c-1