I am having problems with error checking. I want to ensure that the user puts in a name with characters and not use numbers. My thinking is that since player_name is data type char that using ( !player_name) should indicate not to input an int. any suggestions on how to go about this is greatly appreciated. thanks. I have no errors when compiling this but it doesn't work either.

void game::get_name()
{
cout << "Enter your name? ";
cin.getline(player_name, 50);


if(!player_name )
{
cout << "You must enter a name and not a number!" << "\n";


cout << "Enter your name? ";
cin.getline(player_name, 50);
}


}

Recommended Answers

All 10 Replies

I'm not sure but why dont you google "is Alpha" We where taught this a while back and it spring'd back to mind when I reda your post so it must have some meaning... TeeHee ;)

>I want to ensure that the user puts in a name with characters and not use numbers.
Why? Numbers would be a valid string, and forcing your players to enter alphabetic characters may be an unnecessary restriction. Especially since it requires more work and code from you, and therefore more debugging and possible errors.

However, to do it you can use the standard library:

#include <algorithm>
#include <cctype>
#include <cstring>
#include <functional>
#include <iostream>

using namespace std;

int alpha ( int c )
{
  return isalpha ( c );
}

void getname ( char s[], int n )
{
  while ( cin.getline ( s, n )
    && *find_if ( s, s + strlen ( s ), not1 ( ptr_fun ( alpha ) ) ) != '\0' )
  {
    cout<<"No digits allowed. Try again: ";
  }
}

Though it's a little awkward using C-style strings. If you were using std::strings then it would be much easier:

#include <iostream>
#include <string>

using namespace std;

void getname ( string& s )
{
  while ( getline ( cin, s )
    && s.find_first_of ( "0123456789" ) != string::npos )
  {
    cout<<"No digits allowed. Try again: ";
  }
}

To do it manually you can use isalpha in a loop (a C-style solution), but the code is longer and harder to get right:

#include <cctype>
#include <iostream>

using namespace std;

void getname ( char s[], int n )
{
  while ( cin.getline ( s, n ) ) {
    char *p = s;

    while ( *p != '\0' ) {
      if ( !isalpha ( *p ) ) {
        cout<<"No digits allowed. Try again: ";
        break;
      }

      ++p;
    }

    if ( *p == '\0' )
      break;
  }
}

Thank you so much. It's the little things that I always forget or miss.
This is all that was required to make it work... not equal to NULL


if(player_name != '\0')

>not equal to NULL
'\0' and NULL should not be mixed. If you do so it makes your code harder to follow. '\0' is the null character and should only be used in character context, and NULL is the null pointer and should only be used in pointer context.

>if(player_name != '\0')
If you're checking to see if the input is numeric then this doesn't do what you think it does. It checks pointer_name to see if it's a null pointer. However, if it were a null pointer, the program would have crashed here:

cin.getline(player_name, 50);

You've replaced one broken construct that doesn't do what you want with another broken construct that doesn't do what you want.

You are so right about NULL. I have been doing research and have found nothing. If I did find anything it confused me. I am having a hard time finding how to check a string array, everything seems to be checking for int. Here is my whole program.

#include <iostream.h>
#include <stdlib.h>
#include <time.h>
#include <fstream.h>
#include <string.h>
#include <windows.h>   // WinApi header
#include <ctype.h>

class game
{
	public:

	game(); //default constuctor
	void blackjack();

	protected:
	void shuffle();		//prototype for shuffle prog.
	void hit();		//deals one card at a time
	void first_deal();	//deals 2 cards to each player
	void display();		//displays cards, score, and money
	void player_hit_stay();		//player chooses to hit or stay
	void dealer_hit_stay();		//automated dealer hit/stay, hit if total <= 16
	void player_hand_totaler();		//sums cards in player's hand
	void dealer_hand_totaler();		//sums cards in dealer's hand
	void ace_change();		//if total is > 12 then changes aces (11's) to 1's. reruns totaler everytime it changes an ace
	void bust_check();		//checks if either player busts
	void reshuffle();		//reruns shuffle if current card is 52
	void clear_screen();	//couts 20 clear lines
	void clear_hands();		// clears arrays for player and dealer hands, resets bust, winner, hand totals, and bet amount
	void winner_check();	//checks for busts or (if no bust) greater hand total
	void get_name();	//cin's the person's name
	void intro();	//displays program picture and author info
	void bet();		//allows for players to enter a bet. checks for too high bets and negative bets.
	void win_money();	//if player wins, adds 2*bet to total, 3*bet if dealer busts
	int deck[52], player_hand[15], dealer_hand[15];		//sets array for deck, and for each player's hand
	int current_card, player_total, dealer_total;		//current card # (in deck), and player/dealer hand total
	int player_card_number, dealer_card_number;			//card # in player/dealers's hand
	int player;		//sets 1 for player and 2 for dealer, affects turn
	int bust;		//if total is >21, sets bust=1 for player and =2 for dealer.
	int winner;		//set by winner_check, 1 for player, 2 for dealer, 3 for tie
	int bet_amount;		//amount the player bets. entered in bet function
	char player_hit;	//player enters y or n if they want to hit

	public:
	void display_header(); //file display
	void display_record(); //display name and money from record
	int money_total; //total money the player currently has
	char player_name[50]; //player can enter their name, up to 49 characters long

};


	
game::game() //default consturctor
{
	int i=0;
	for(i=0; i<=51; i++) //initialzes deck
	{
		deck[i]=0;
	}
	for(i=0; i<=14; i++) //initializes player/dealer hand arrays
	{
		player_hand[i]=0;
		dealer_hand[i]=0;
	}

	current_card = 0;
	player_total = 0;
	dealer_total = 0;
	player_card_number = 0;
	dealer_card_number = 0;
	player = 1;
	player_hit = ' ';
	bust = 0;
	winner = 0;
	money_total = 100;

	
}


void game::intro()
{
	

	cout << " -------------  -------------\n"
		 << " |   -----  J|  |          A|\n"
		 << " |    '<'    |  |     A     |\n"
		 << " |     -     |  |    A A    |\n"
		 << " |    / \\    |  |   A   A   |\n"
		 << " | +-( J )-+ |  |  AAAAAAA  |\n"
		 << " |    \\ /    |  |  A     A  |\n"
		 << " |    | |    |  |  A     A  |\n"
		 << " |J   - -    |  |A          |\n"
		 << " -------------  -------------\n"
		 << "         BLACKJACK 21!\n";
		 
		cout << "\n";
		get_name();
	
}

void game::get_name()
{
	cout << "Enter your name? ";
	cin.getline(player_name, 50);

	
	//if(player_name )
	{
		cout << "You must enter a name and not a digit!" << "\n""\n";

		clear_screen();

		cout << "Enter your name? ";
		cin.getline(player_name, 50);
	}
	
	
}

//player make bet
void game::bet()
{
	cout << "\n\nyou have $" << money_total;
	cout << "\nplease only bet in whole dollar amounts.";
	cout << "\nhow much do want to you bet? ";
	cin >> bet_amount;


//checks bet amount to be in range of money 
	while ((bet_amount > money_total)||(bet_amount < 0))

		{
		//if bet is over money in players bank
		if (bet_amount > money_total)
		{
			cout << "\nyou bet more money than you have. no, you can't bet your car keys. fool.\n\n";

			clear_screen();
			

			cout << "\n\nyou have $" << money_total;
			cout << "\nplease only bet in whole dollar amounts.";
			cout << "\nhow much do want to you bet? ";
			cin >> bet_amount;
		}
		//can't bet a negative amount
		else if (bet_amount < 0)
		{
			cout << "\nyou can't bet negative money!\n\n";

			clear_screen();
			
			cout << "\n\nyou have $" << money_total;
			cout << "\nplease only bet in whole dollar amounts.";
			cout << "\nhow much do want to you bet? ";
			cin >> bet_amount;

		}
		
	
	}
	money_total = money_total - bet_amount;

}

void game::blackjack() //"main" part of program
{
	intro();
	char play_again = 'y';
	shuffle();
	do
	
	{
		bet();
		clear_screen();
		first_deal();
		player_hit_stay();
		if (bust == 1)
		{
			clear_screen();

			cout << "you bust!\n\n";
			//winner = 2;
		}		
		else if (bust == 0)
		{
			dealer_hit_stay();
			if (bust == 2)
				{
					clear_screen();
					cout << "dealer busts!\n\n";
					//winner = 1;
				}
			else if (bust == 0)
			{
				clear_screen();
				cout << "Dealer stays.\n\n";
				
			}
		}
		
		winner_check();//here winner_check will be called
		
		if (money_total > 0)
		{
			cout << "\n\nanother round? (y for yes, n for no) ";
			cin >> play_again;
			while ((play_again != 'y')&&(play_again != 'Y')&&(play_again != 'n')&&(play_again != 'N'))
			{
				cout << "\n\nyou did not enter a y or n. please try again: ";
				cin >> play_again;
			}
		
			clear_hands();
			clear_screen();
			
		}
	
	}	//keep playing game
		while ((money_total > 0)&&((play_again == 'y')||(play_again == 'Y')));

		clear_screen();


		//to save player name and money win to record
//	if((money_total > 0) && (play_again = 'n')&&(play_again = 'N'))
		//{
		//	cout << "Save your name and winnings (Y for yes and N for n)";
		//	cin >> play_again;
			//if((play_again = 'y')&&(play_again = 'Y'))
		//	{
			//	ofstream tofile;	//save_name();
			//}

		//}

	
	if (money_total <= 0)
	{
		cout << "\n\nsorry, you ran out of money. goodbye!\n";
	
	}

	clear_screen();
	cout << "\n";
}



void game::shuffle() 
{
	int unshuffled[] = {2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11, 11, 11, 12, 12, 12, 12, 13, 13, 13, 13, 14, 14, 14,14};
	//sets the unshuffled deck.
	int picked = 0; //number variable, used in function

	srand(time(0));
	
	for(int x=0; x<=51; x++)
	{
		picked = (1 + rand() % 52) ;
				
		while (unshuffled[picked -1] == 0) 
		//tests if card picked was already picked (set to 0). if so, chooses another.
		{
			picked = (1 + rand() % 52) ;
		}

		deck[x] = unshuffled[picked - 1]; //sets card in deck used to card in unshuffled deck.
		unshuffled[picked -1] = 0; //"deletes" card in unshuffled deck so it cannot be used again.
		current_card=0;
	}

}

void game::hit()
{
	reshuffle();
	if (player==1)
	{
		player_hand[player_card_number]=deck[current_card];
		player_card_number++;
		player_hand_totaler();
	}

	if (player==2)
	{
		dealer_hand[dealer_card_number]=deck[current_card];
		dealer_card_number++;
		dealer_hand_totaler();
	}
	current_card++;
	ace_change();
	bust_check();
	
}

void game::first_deal()
{
	player=1;
	hit();
	hit();
	player++;
	hit();
	hit();

}

void game::display()
{
	int c=0;

	if (winner == 0)
	{
		cout << "Dealer:\n";
	}
	else
	{
		cout << "Dealer: (total) " << dealer_total << "\n";
	}
	
	for (c=0; c<=14; c++)//draws top of card
	{
		if (dealer_hand[c] != 0)
		{
			cout << " +---+ ";
		}
	}
	cout << endl;
		for (c=0; c<=14; c++)//draws top of card
	{
		if (dealer_hand[c] != 0)
		{
			cout << " |   | ";
		}
	}
	cout << endl;
	
	for (c=0; c<=14; c++)
	{
		//displays a J, Q, or K instead of card values 12, 13, and 14
		//J-K is 12-14 so that the Ace can be 11 automatically
		if (dealer_hand[c] != 0)
		{
			cout << " | ";
			if ((winner == 0)&&(c == 0))
				{
					cout << "? ";
				}
			else if (dealer_hand[c]==10)
			{
				cout << "10";
			}
			else if ((dealer_hand[c]==11)||(dealer_hand[c]==1))
			{
				cout << "A ";
			}			
			else if (dealer_hand[c]==12)
			{
				cout << "J ";
			}
			else if (dealer_hand[c]==13)
			{
				cout << "Q ";
			}
			else if (dealer_hand[c]==14)
			{
				cout << "K ";
			}
			else
			{
				cout << dealer_hand[c] << " ";
			}

			cout << "| ";
		}
	}
	cout << endl;
	
	for (c=0; c<=14; c++)//draws middle of card
	{
		if (dealer_hand[c] != 0)
		{
			cout << " |   | ";
		}
	}
	cout << endl;
	
	for (c=0; c<=14; c++)//draws bottom of card
	{
		if (dealer_hand[c] != 0)
		{
			cout << " +---+ ";
		}
	}
	//displays players name, total of hand and money 
	cout << "\n\n" << player_name << ": (total) " << player_total << ", total money: $" << money_total << "\n";
		
	for (c=0; c<=14; c++)//draws top of card
	{
		if (player_hand[c] != 0)
		{
			cout << " +---+ ";
		}
	}
	cout << endl;
		for (c=0; c<=14; c++)//draws top of card
	{
		if (player_hand[c] != 0)
		{
			cout << " |   | ";
		}
	}
	cout << endl;
	
	for (c=0; c<=14; c++)
	{
		//displays a J, Q, or K instead of card values 12, 13, and 14
		//J-K is 12-14 so that the Ace can be 11 automatically
		if (player_hand[c] != 0)
		{
			cout << " | ";
			if (player_hand[c]==10)
			{
				cout << "10";
			}
			else if ((player_hand[c]==11)||(player_hand[c]==1))
			{
				cout << "A ";
			}			
			else if (player_hand[c]==12)
			{
				cout << "J ";
			}
			else if (player_hand[c]==13)
			{
				cout << "Q ";
			}
			else if (player_hand[c]==14)
			{
				cout << "K ";
			}
			else
			{
				cout << player_hand[c] << " ";
			}
			cout << "| ";
		}
	}
	cout << endl;
	
	for (c=0; c<=14; c++)//draws middle of card
	{
		if (player_hand[c] != 0)
		{
			cout << " |   | ";
		}
	}
	cout << endl;
	
	for (c=0; c<=14; c++)//draws bottom of card
	{
		if (player_hand[c] != 0)
		{
			cout << " +---+ ";
		}
	}
	

}

void game::player_hit_stay()
{
	player=1;
	player_hit = 'y';

	while (((player_hit == 'y')||(player_hit == 'Y'))&&(bust == 0))
	{
		clear_screen();
		display();
		cout << "\n\nwould you like to hit? (y for yes or n for no) ";
		cin >> player_hit;
		while ((player_hit != 'y')&&(player_hit != 'Y')&&(player_hit != 'n')&&(player_hit != 'N'))
		{
			cout << "\n\nyou did not enter a y or n. please try again: ";
			cin >> player_hit;
		}

		if ((player_hit == 'y')||(player_hit == 'Y'))
		{
			hit();
		}
	}
	
}

void game::dealer_hit_stay()
{
	player = 2;
	while ((dealer_total < 17)&&(bust != 2))
	{
		if (bust == 0)
		{
			hit();
			clear_screen();
			cout << "\nDealer hits!\n";
			display();
		}
	}	

}


//converts k,q,j to value of 10 for player hand
void game::player_hand_totaler()
{
	int c=0;
	player_total=0;
	for(c=0; c<=14; c++) //totals player hand
	{
		//this if statement adds 10 for J, Q, and K instead of 12, 13, and 14
		//J-K is 12-14 so that the Ace can be 11 automatically
		if ((player_hand[c]==12)||(player_hand[c]==13)||(player_hand[c]==14))
		{
			player_total=player_total+10;
		}
		else // adds current card
		{
			player_total=player_total+player_hand[c];
		}
	}
	//return;
}
//converts k,q,j to value of 10 for dealer hand
void game::dealer_hand_totaler()
{
	int c=0;
	dealer_total=0;
	for(c=0; c<=14; c++) //totals player hand
	{
		//this if statement adds 10 for J, Q, and K instead of 12, 13, and 14
		//J-K is 12-14 so that the Ace can be 11 automatically
		if ((dealer_hand[c]==12)||(dealer_hand[c]==13)||(dealer_hand[c]==14))
		{
			dealer_total=dealer_total+10;
		}
		else //else adds current card
		{
			dealer_total=dealer_total+dealer_hand[c];
		}
	}

}
//clears the screen
void game::clear_screen() 
{
	system("cls");
}
//clears cards for new hand
void game::clear_hands()
{
	int c=0;
	player_card_number = 0;
	dealer_card_number = 0;
	player_total = 0;
	dealer_total = 0;
	bust = 0;
	winner = 0;
	bet_amount = 0;
	for (c=0; c<=14; c++)
	{
		player_hand[c] = 0;
	}
	for (c=0; c<=14; c++)
	{
		dealer_hand[c] = 0;
	}
	
}
//checks for ace to be 1 or 11
void game::ace_change()
{
	int c=0;
	if ((player_total >= 22)&&(player_total != 21))
	{
		for (c=0; c <=14; c++)
		{
			if (player_hand[c]==11)
			{
				player_hand[c]=1;
				player_hand_totaler();
			}
		}
	}
		if ((dealer_total >= 22)&&(dealer_total != 21))
	{
		for (c=0; c <=14; c++)
		{
			if (dealer_hand[c]==11)
			{
				dealer_hand[c]=1;
				dealer_hand_totaler();
			}
		}
	}
	player_hand_totaler();
	dealer_hand_totaler();
}
//reshuffle cards for new hand
void game::reshuffle()
{
	if (current_card == 52)
	{
		shuffle();
		current_card=0;
	}
	
}
//checks for bust
void game::bust_check()
{
	if (player_total >= 22)
	{
		bust = 1;
	}

	if (dealer_total >= 22)
	{
		bust = 2;
	}
	
}

//in this blackjack game, your $ is already subtracted. therefore, 
//when you lose, no money is subtracted because your bet has already been subtracted.
void game::winner_check()
{
	if (bust == 0)
	{
		if (player_total > dealer_total)
		{
			winner = 1;
			win_money();
			display();
			cout << "\n\nyou win!\n\n";
		}
		else if (player_total < dealer_total)
		{
			winner = 2;
			display();
			cout << "\n\nyou lose!\n\n";
		}
		else if (player_total == dealer_total)
		{
			winner = 3;
			money_total = money_total + bet_amount; //you dont lose anything for a tie.
			display();
			cout << "\n\ntie!\n\n";
		}
	}
	else
	{
		if (bust == 1)
		{
			winner = 2;
			display();
			cout << "\n\nyou lose!\n\n";
		}
		if (bust == 2)
		{
			winner = 1;
			win_money();
			display();
			cout << "\n\nyou win!\n\n";
		}
	}

}

//determines money win
void game::win_money()
{
	if (bust == 2)//player gets twice his bet back if the dealer busts
	{
		money_total = money_total + (3 * bet_amount);
	}
	else
	{
		money_total = money_total + (2 * bet_amount);
	}

}

//display header for record
void game::display_header()
{

 
cout << "  Player       Bank"<<"\n";
cout << "___________________________";
cout << "\n";


}
//display name and money amount
void game::display_record()
{

cout << player_name << "\t"<<"\t"<< money_total;

cout  <<"\n";
}

int main()
{
		//code to color text to blue
		HANDLE  hConsole;
        int k = 11;	// pick the colorattribute k you want
		hConsole = GetStdHandle(STD_OUTPUT_HANDLE);

		
        SetConsoleTextAttribute(hConsole, k);
              
        
	game player;
	
	player.blackjack();



	
	ofstream tofile;
	
	tofile.open("Blackjack.txt", ios::app); //write to record

		if(tofile.fail())
		{
			cout << "Record failed to open";
			exit(1);
		}

			if (player.money_total > 0)
			{		
			tofile << player.player_name <<"\n"<< player.money_total<<"\n";
			cout<<"\n";

			}
		tofile.close();


	
		
	ifstream infile; //read from record

	infile.open("Blackjack.txt");

	player.game::display_header();


	while(!infile.eof())
	{
	infile >> player.player_name;
	infile >> player.money_total;

	if(infile.eof() == 0 )  //to remove duplicacy
			{	
	player.game::display_record();
	}
	}
	infile.close();

	return 0;
}

Code tags added. -Narue

>I am having a hard time finding how to check a string array
What do you mean by "check" a string array? There are a lot of things you could mean, and that makes answering your question difficult. It's also not wise to post reams of code. Shrink your code down to a small example program that exhibits the problems you're having, otherwise nobody will waste their time helping you.

I usually do not post entire code. will heed your warning. I read up on isalpha and isdigit. I cannot find anything that lets me write a condition statement when using a string array. the string will accept both char and int. int isalpha(char) returns a nonzero number if the character is a letter, otherwise it retruns a zero. this is what my book says. the code sniplets you provided use reference passing and pointers. I would rather avoid both because anything I add to this code gives me an error. So far I haven't found any information as to checking user input for char. I am ok if it is one letter, but cannot do it with strings. I haven't found anything on the web either that checks for char string input, everything is for int.

thx for all your help and advice

Give me an example of strings that would pass your test and strings that would fail your test. Your wording is too vague for me to help much.

User is asked to enter name. char player_name[50]; User enters name (example) Charlie. the program gets no errors because charlie is all letters of the alphabet. next user comes along and when asked to enter name, enters cha3l43 or 343455. this is not acceptable and user needs to enter name made up of letters from alphabet. I am sorry that I am having trouble explaining this. I have never had to write condition statement for string input before.

And here I thought you were asking for something odd. All of the examples I first gave you do exactly what you want. But since you seem exceptionally helpless, I'll solve your problem for you (just this once though):

bool is_valid_name ( char name[] )
{
  for ( int i = 0; name[i] != '\0'; i++ )
  {
    if ( !isalpha ( name[i] )
      return false;
  }

  return true;
}

void game::get_name()
{
  cout << "Enter your name? ";
  cin.getline(player_name, 50);

  while(!is_valid_name(player_name))
  {
    cout << "You must enter a name and not a digit!" << "\n""\n";

    clear_screen();

    cout << "Enter your name? ";
    cin.getline(player_name, 50);
  }
}
Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.