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

时间:2015-04-16 10:14:16

标签: c

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

线&lt; 41&gt;是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 <stdio.h>
#include <time.h>
#include <ctype.h>
#include <stdlib.h>

#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 <= 1; sub++) { /* Counts from 0 to 1 */
        playerPoints[sub] = dealerPoints[sub] = total[sub]=0; }
    dispTitle();
    if (askedForName ==0) { /* Name asked for nly once */
        printf("\nWhat is your first name? ");
        scanf_s(" %s", firstName);
        askedForName = 1; /* Don't ask prompt again */
        printf("Ok, %s, get ready for casino action!\n\n", firstName);
        getchar(); /* Discards newline. You can safely */
    }           /* ignore compiler warning here. */
    return;
}

/*** This function gets a card for the player and updates the player's points. ***/
void playerGetsCard(int *numCards, int cards[52], int playerPoints[2])
{
    int newCard;
    newCard = dealCard(numCards, cards);
    printf("You draw: ");
    dispCard(newCard, playerPoints);
}

/*** This function gets a card for the dealer and updates the dealer's poimts. ***/
void dealerGetsCard(int *numCards, int cards[52], int dealerPoints[2])
{
    int newCard;
    newCard = dealCard(numCards, cards);
    printf("The dealer draws: ");
    dispCard(newCard, dealerPoints);
}

/*** This function gets a card from the deck and stores it in either the dealer's or the player's hold of cards ***/
int dealCard(int * numCards, int cards[52])
{
    int cardDrawn, subDraw;
    time_t t; /* Gets time for a random value */
    srand((unsigned int)(time(&t)));  /* Seeds random-number generator */
    subDraw = (rand() % (*numCards)); /* From 0 to numcards */
    cardDrawn = cards[subDraw]; 
    cards[subDraw] = cards[*numCards -1]; /* Puts top card */
    (*numCards); /* in place of drawn one */
    return cardDrawn;
}

/*** Displays the last drawn card and updates points with it. ***/
void dispCard(int cardDrawn, int points[2])
{
    switch (cardDrawn) {
    case(11) : printf("%s\n", "Jack");
        points[ACELOW] += 10;
        points[ACEHIGH] += 10;
        break;
    case(12) : printf("%s\n", "Queen");
        points[ACELOW] += 10;
        points[ACEHIGH] += 10;
        break;
    case(13) : printf("%s\n", "King");
        points[ACELOW] += 10;
        points[ACEHIGH] += 10;
        break;
    default : points[ACELOW] += cardDrawn;
        if (cardDrawn == 1)
        { 
            printf("%s\n", "Ace");
            points[ACEHIGH] += 11;
        }
        else
        {
            points[ACEHIGH] += cardDrawn;
            printf("%d\n", cardDrawn); 
        }
    } return;
}

/*** Figure the total for player or dealer to see who won. This function takes into account the fact that Ace is either 1 or 11. ***/
void totalIt(int points[2], int total[2], int who)
{
    /* The following routine first looks to see if the total points counting Aces as 1 is equal to the total points couning Aces as 11. If so, 
    or if the total points counting Aces as 11 is more than 21, the program uses the total with Aces as 1 only */
    if ((points[ACELOW] == points[ACEHIGH]) || (points[ACEHIGH] > 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)) {
        printf("The house wins.\n");
        return;
    }
    if ((total[PLAYER] > 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;
}

2 个答案:

答案 0 :(得分:5)

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

while (ans == 'Y')

在那里,您要比较单个字符(这是一个数字,因此与另一个数字相当)。

另一方面,在代码失败的情况下,您使用双引号。

ans == "H"

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

答案 1 :(得分:1)

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

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

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

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

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

然后编译器会忽略不同级别的间接内容,而不是告诉您要尝试比较的类型是不兼容的。这是因为在尝试执行比较时,编译器认为'\0'不是一个字符数组,而是作为指向数组第一个字符的指针,但这仍然无济于事,因为它结束了up with是指向一个字符的指针(一个间接级别),同时它需要一个字符。 (零间接间接。)