我读到,在将数组作为参数传递时,我们还必须将其长度作为参数传递(strict C89)。 在这个给定的代码片段中
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#define NUM_RANKS 13
#define NUM_SUITS 4
#define NUM_CARDS 5
bool straight, flush, four, three;
int pairs;
void read_cards(int a[], int b[]); // I did't specify the length in this declaration
void analyze_hand(int a[], int b[]); // I did't specify the length in this declaration
void print_result(void);
int main()
{
int num_in_rank[NUM_RANKS];
int num_in_suit[NUM_SUITS];
for(;;)
{
read_cards(num_in_rank, num_in_suit);
analyze_hand(num_in_rank, num_in_suit);
print_result();
}
}
void read_cards(int num_in_rank[], int num_in_suit[])
{
bool card_exists[NUM_RANKS][NUM_SUITS];
char ch, rank_ch, suit_ch;
int rank, suit;
bool bad_card;
int cards_read = 0;
for(rank = 0; rank < NUM_RANKS; rank++)
{
num_in_rank[rank] = 0;
for(suit = 0; suit < NUM_SUITS; suit++)
card_exists[rank][suit] = false;
}
for(suit = 0; suit < NUM_SUITS; suit++)
num_in_suit[suit] = 0;
while(cards_read < NUM_CARDS)
{
bad_card = false;
printf("Enter a card: ");
rank_ch = getchar();
switch(rank_ch)
{
case '0': exit(EXIT_SUCCESS);
case '2': rank = 0; break;
case '3': rank = 1; break;
case '4': rank = 2; break;
case '5': rank = 3; break;
case '6': rank = 4; break;
case '7': rank = 5; break;
case '8': rank = 6; break;
case '9': rank = 7; break;
case 't': case 'T': rank = 8; break;
case 'j': case 'J': rank = 9; break;
case 'q': case 'Q': rank = 10; break;
case 'k': case 'K': rank = 11; break;
case 'a': case 'A': rank = 12; break;
default: bad_card = true;
}
suit_ch = getchar();
switch(suit_ch)
{
case 'c': case 'C': suit = 0; break;
case 'd': case 'D': suit = 1; break;
case 'h': case 'H': suit = 2; break;
case 's': case 'S': suit = 3; break;
default: bad_card = true;
}
while((ch = getchar()) != '\n')
if(ch != ' ')
bad_card = true;
if(bad_card)
printf("Bad card; ignored.\n");
else if(card_exists[rank][suit])
printf("Duplicate card; ignored.\n");
else
{
num_in_rank[rank]++;
num_in_suit[suit]++;
card_exists[rank][suit] = true;
cards_read++;
}
}
}
void analyze_hand(int num_in_rank[], int num_in_suit[])
{
int num_consec = 0;
int rank, suit;
straight = false;
flush = false;
four = false;
three = false;
pairs = 0;
for(suit = 0; suit < NUM_SUITS; suit++)
if(num_in_suit[suit] == NUM_CARDS)
flush = true;
rank = 0;
while(num_in_rank[rank] == 0)
rank++;
for(; rank < NUM_RANKS && num_in_rank[rank] > 0; rank++ )
num_consec++;
if(num_consec == NUM_CARDS)
{
straight = true;
return;
}
for(rank = 0; rank < NUM_RANKS; rank++)
{
if(num_in_rank[rank] == 4)
four = true;
if(num_in_rank[rank] == 3)
three = true;
if(num_in_rank[rank] == 2)
pairs++;
}
}
我将两个数组 num_in_rank[NUM_RANKS]
和 num_in_suit[NUM_SUITS]
一起传递给函数 void read_cards(int a[], int b[] )
和 void analyze_hand(int a[], int b[])
没有提供数组长度,我不知道这是如何工作的(没有任何警告/错误)?
任何想法是对还是错?
最佳答案
I read that while passing an array as argument we must also have to pass its length as argument
这仅适用于函数事先不知道数组大小的情况。当函数知道数组必须有一定数量的元素时,就不需要将大小传递给函数。
这正是您的代码中发生的事情:接收数组的两个函数都知道 num_in_rank
恰好包含 NUM_RANKS
元素,而 num_in_suit
包含恰好 NUM_SUITS
个元素。这就是为什么您不需要传递大小,并且什么也不会发生:函数已经通过 #define
d 常量知道了大小。
另一方面,如果您需要传递一个大小未知的数组给您的函数,那么您需要执行以下操作之一:
- 传递数组中元素的数量,或者
- 将指针传递给数组的最后一个元素(或最后一个元素之后的元素),或者
- 商定一个“哨兵”值,如零或负值,表示数组中有效数据范围的结束。
关于c - 将数组作为参数传递给函数而不将数组的长度传递给该函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17622733/