int与char 错误的间接级别不同

代码来自Absolute初学者对C的指南,我得到了这个错误./BlackJack.c : warning C4047: '==' : 'int' differes in levels of indirection from 'char [2]'当我尝试在Visual Studio中编译它。 这是二十一点游戏的主要function。

第行是if (ans == "H") {

 main() { int numCards; /* Equals 52 at the beginneing */ int cards[52], playerPoints[2], dealerPoints[2], total[2]; /* For user Hit/Stand or Yes/No response */ do { initCardsScreen(cards, playerPoints, dealerPoints, total, &numCards); dealerGetsCard(&numCards, cards, dealerPoints); printf("\n"); playerGetsCard(&numCards, cards, playerPoints); playerGetsCard(&numCards, cards, playerPoints); do { ans = getAns("Hit or stand (H/S)? "); if (ans == "H") { platerGetsCard(&numCards, cards, playerPoints); } } while ( ans != 'S'); totalIt(playerPoints, total, PLAYER); /* Player's total */ do { dealerGetsCard(&numCards, cards, dealerPoints); } while (dealerPoints[ACEHIGH] < 17); /* 17: Dealer stop */ totalIt(dealerPoints, total, DEALER); /* Dealer's total */ findWinner(total); ans = getAns("\nPlay again (Y/N)? "); } while (ans == 'Y'); return; } 

(更新):这是整个代码。

 #include  #include  #include  #include  #define BELL '\a' #define DEALER 0 #define PLAYER 1 #define ACELOW 0 #define ACEHIGH 1 int askedForName = 0; /**************************** This program specific prototype ****************************/ void dispTitle(void); void initCardsScreen(int cards[52], int playerPoints[2], int dealerPoints[2], int total[2], int * numCards); int dealCard(int * numCards, int cards[52]); void dispCard(int cardDrawn, int points[2]); void totalIt(int points[2], int total[2], int who); void dealerGetsCard(int *numCards, int cards[52], int dealerPoints[2]); void playerGetsCard(int *numCards, int cards[52], int playerPoints[2]); char getAns(char mesg[]); char ans; void findWinner(int total[2]); main() { int numCards; /* Equals 52 at the beginneing */ int cards[52], playerPoints[2], dealerPoints[2], total[2]; /* For user Hit/Stand or Yes/No response */ do { initCardsScreen(cards, playerPoints, dealerPoints, total, &numCards); dealerGetsCard(&numCards, cards, dealerPoints); printf("\n"); playerGetsCard(&numCards, cards, playerPoints); playerGetsCard(&numCards, cards, playerPoints); do { char ans = getAns("Hit or stand (H/S)? "); if (ans == "H") { playerGetsCard(&numCards, cards, playerPoints); } } while ( ans != 'S'); totalIt(playerPoints, total, PLAYER); /* Player's total */ do { dealerGetsCard(&numCards, cards, dealerPoints); } while (dealerPoints[ACEHIGH] < 17); /* 17: Dealer stop */ totalIt(dealerPoints, total, DEALER); /* Dealer's total */ findWinner(total); ans = getAns("\nPlay again (Y/N)? "); } while (ans == 'Y'); return; } void initCardsScreen(int cards[52], int playerPoints[2], int dealerPoints[2], int total[2], int *numCards) { int sub, val=1; /* This function's Work variables */ char firstName[15]; /* Holds user's first name */ *numCards = 52; /* Holds running total of number of cards */ for (sub = 0; sub <= 51; sub++) { /* Counts from 0 to 51 */ val = (val == 14) ? 1 : val; /* If val is 14 reset to 1 */ cards[sub] = val; val++; } for (sub = 0; sub  21)) { total[who] = points[ACELOW]; /* Keeps all Aces as 1 */ } else { total[who] = points[ACEHIGH]; /* Keeps all Aces as 11 */ } if (who == PLAYER) /* Determines the message printed */ { printf("You have a total of %d\n\n", total[PLAYER]); } else { printf("The house stands with a total of %d\n\n", total[DEALER]); } return; } /*** Prints the winning player. ***/ void findWinner(int total[2]) { if (total[DEALER] == 21) { printf("The house wins.\n"); return; } if ((total[DEALER] > 21) && (total[PLAYER] > 21)) { printf("%s", "Nobody wins.\n"); return; } if ((total[DEALER] >= total[PLAYER]) && (total[DEALER]  21) && (total[DEALER] < 21)) { printf("The house wins.\n"); return; } printf("%s%c", "You win!\n", BELL); return; } /*** Gets the user's uppercase, single-character response. ***/ char getAns(char mesg[]) { char ans; printf("%s", mesg); /* Prints the prompt message passed */ ans = getchar(); getchar(); /* Discards newline. You can safely ignore compiler warning here. */ return toupper(ans); } /*** Clears everything off the screen. ***/ void dispTitle(void) { int i=0; while (i < 25) { /* Clears screen by printing 25 blank lines to 'push off' stuff that might be left over on the screen before this program */ printf("\n"); i++; } printf("\n\n*Step right up to the Blackjack tables*\n\n"); return; } 

请注意您的所有其他比较如何都有单引号?

 while (ans == 'Y') 

在那里,你要比较一个字符(这是一个数字,因此可以与另一个数字相比)。

另一方面,在失败的代码中,您使用的是双引号。

 ans == "H" 

所以你要比较一个字符串,这是一个字符数组。 该数组长度为两个字符以容纳空终止符 。

"H" (双引号)是一个字符串,而不是一个字符。 要获得包含字母H的字符常量,您需要'H' (单引号)。因此,您的行应该读取if( ans == 'H' )

if( ans == "H"[0] )也将起作用。 这将将ans与字符串"H"的第一个(第零个)字符进行比较。

我同意这是一个简单的类型不匹配错误的神秘信息。 归咎于C和C编译器。 (我可以建议您使用一些更现代的语言,如C#或Java吗?)

编译器将您的ans报告为int而您可能已将其声明为char 。 (我不知道你是如何声明它的,因为你似乎已经从你发布的源代码中省略了它的声明。)如果发生这种情况,那是因为编译器在尝试将它与之比较时隐式地将char转换为int 。别的。

编译器还将您的"H"报告为char[2] ,并且可能不会立即显而易见:C使用以null结尾的字符串,因此字面“H”表示为2个字符的数组,其中第一个字符是'H' ,第二个字符是空字符。 ( '\0' )。

然后编译器会忽略不同级别的间接内容,而不是告诉您要尝试比较的类型是不兼容的。 这是因为在尝试执行比较时,编译器认为"H"不是一个字符数组,而是作为指向数组第一个字符的指针,但这仍然无济于事,因为它最终得到的是一个指向一个角色,(一个间接的层次),而它需要一个角色。 (间接零水平。)