简体   繁体   中英

Weird symbols printing out instead of strings

I tried to make this simple program to simulate opening a crate in a game. However, when I run it (inputting 1, 2, or 3 first, followed by a large number, like 100), it will print out almost everything correctly, but sometimes (one or two times out of 100) it will print strange symbols instead of the string it should print. Why is that?

#include <iostream>
#include <cstdlib>
#include <ctime>
#include <string>
#include <windows.h>

using namespace std;
//This function is only here to make retrieving random numbers more pretty.
int getrand(int min, int max);
//This function will return what level of rarity the item is as a string.
string getrare();
//This function will return the certification of the item as a string.
string getcert();
//This function will return the crate being opened to a string, and will error check.
string cratePrompt();
//This function will return the specific item received from a specific crate.
string getitem(string crateNum);
int rareCount=0;
int veryrareCount=0;
int importCount=0;
int exoticCount=0;
int blackmarketCount=0;
int certCount=0;


int main(){

    unsigned seed;
    //This group of text here is to get a seed for randomness.
    seed=time(0);
    srand(seed);

    //This is where the magic happens.
    int count=0;
    int crateQuantity;
    string certTest;
    string crateChosen;
    crateChosen=(cratePrompt());
    cout<<"\nHow many crates do you want to open?\n\n";
    cin>>crateQuantity;
    cout<<endl;
    string itemActual;
    while(count<crateQuantity){
      certTest=getcert();
      if (certTest!="Null"){
        cout<<certTest<<" ";
      }
      cout<<getitem(crateChosen);
      cout<<endl;
      count++;
    }
    cout<<"\n\n\nYou got "<<rareCount<<" Rare items!\n";
    cout<<"You got "<<veryrareCount<<" Very Rare items!\n";
    cout<<"You got "<<importCount<<" Import items!\n";
    cout<<"You got "<<exoticCount<<" Exotic items!\n";
    cout<<"You got "<<blackmarketCount<<" Black Market items!\n\n";
    cout<<certCount<<" of the items were certified!";
}

int getrand(int min, int max){
  return ((rand()%(max-min+1))+min);
}
string getrare(){
int rando=(getrand(1,10000));
if ((rando>=1)&&(rando<=5472)){
  rareCount++;
  return "Rare";
}
else if ((rando>=5473)&&(rando<=8264)){
  veryrareCount++;
  return "Very Rare";
}
else if ((rando>=8265)&&(rando<=9476)){
  importCount++;
  return "Import";
}
else if ((rando>=9477)&&(rando<=9868)){
  exoticCount++;
  return "Exotic";
}
else if ((rando>=9869)&&(rando<=10000)){
  blackmarketCount++;
  return "Black Market";
}
else{
  return "An error has happened";
}
}
string getcert(){
  int iscert=getrand(1,100);
  int whichcert=getrand(1,15);
  if ((iscert>=16)&&(iscert<=100)){
    return "Null";
  }
  else if ((iscert>=1)&&(iscert<=15)){
    certCount++;
    if (whichcert==1){
      return "[Acrobat]";
    }
    if (whichcert==2){
      return "[Aviator]";
    }
    if (whichcert==3){
      return "[Goalkeeper]";
    }
    if (whichcert==4){
      return "[Guardian]";
    }
    if (whichcert==5){
      return "[Juggler]";
    }
    if (whichcert==6){
      return "[Paragon]";
    }
    if (whichcert==7){
      return "[Playmaker]";
    }
    if (whichcert==8){
      return "[Scorer]";
    }
    if (whichcert==9){
      return "[Show-Off]";
    }
    if (whichcert==10){
      return "[Sniper]";
    }
    if (whichcert==11){
      return "[Striker]";
    }
    if (whichcert==12){
      return "[Sweeper]";
    }
    if (whichcert==13){
      return "[Tactician]";
    }
    if (whichcert==14){
      return "[Turtle]";
    }
    if (whichcert==15){
      return "[Victor]";
    }
  }
  else{
    return "An error has happened";
  }
}
string cratePrompt(){
  string answer;
  bool valid=0;

  while (valid==0){
  cout<<"Which crate do you want to open?\n\n";
  cin>>answer;
  if ((answer=="1")||(answer=="c1")||(answer=="cc1")||(answer=="C1")||(answer=="CC1")){
    return "CC1";
  }
  else if ((answer=="2")||(answer=="c2")||(answer=="cc2")||(answer=="C2")||(answer=="CC2")){
    return "CC2";
  }
  else if ((answer=="3")||(answer=="c3")||(answer=="cc3")||(answer=="C3")||(answer=="CC3")){
    return "CC3";
  }
  else if ((answer=="4")||(answer=="c4")||(answer=="cc4")||(answer=="C4")||(answer=="CC4")){
    return "CC4";
  }
  else{
    cout<<"Please enter a valid option (1, 2, 3, or 4)\n";
  }
  }
}
string getitem(string crateNum){
  string rarity = getrare();
  //(Rarity)Select is used to select exactly which item they will get out of the possibilities.
  int BMSelect= getrand(1,6);
  int ESelect= getrand(1,2);
  int ISelect= getrand(1,3);
  int VRSelect= getrand(1,4);
  int RSelect= getrand(1,5);
  if (crateNum=="CC1"){
    if (rarity=="Rare"){
      if(RSelect==1){
        return "(Takumi) Combo";
      }
      else if(RSelect==2){
        return "(Breakout) Vice";
      }
      else if(RSelect==3){
        return "(Dominus) Pollo Caliente";
      }
      else if(RSelect==4){
        return "(Dominus) Arcana";
      }
      else if(RSelect==5){
        return "(Breakout) Shibuya";
      }
    }
    else if (rarity=="Very Rare"){
      if (VRSelect==1){
        return "(Takumi) Anubis";
      }
      else if (VRSelect==2){
        return "(Breakout) Dot Matrix";
      }
      else if (VRSelect==3){
        return "(Dominus) Snakeskin";
      }
      else if (VRSelect==4){
        return "Chakrams";
      }
    }
    else if (rarity=="Import"){
      if (ISelect==1){
        return "Dominus GT";
      }
      else if (ISelect==2){
        return "Trinity";
      }
      else if (ISelect==3){
        return "Takumi RX-T";
      }
    }
    else if (rarity=="Exotic"){
      if (ESelect==1){
        return "Photons";
      }
      else if (ESelect==1){
        return "Loopers";
      }
    }
    else if (rarity=="Black Market"){
      if (BMSelect==1){
        return "Biomass";
      }
      else if (BMSelect==2){
        return "Heatwave";
      }
      else if (BMSelect==3){
        return "Hexed";
      }
      else if (BMSelect==4){
        return "Slipstream";
      }
      else if (BMSelect==5){
        return "Parallax";
      }
      else if (BMSelect==6){
        return "Labyrinth";
      }
    }
    else{
      cout<<"AN ERROR HAS OCCURED";
    }
  }
  if (crateNum=="CC2"){
    if (rarity=="Rare"){
      if(RSelect==1){
        return "(Octane) Dragon Lord";
      }
      if(RSelect==2){
        return "(Venom) Nine Lives";
      }
      if(RSelect==3){
        return "(Road Hog) Carbonated";
      }
      if(RSelect==4){
        return "(Takumi) Whizzle";
      }
      if(RSelect==5){
        return "(Merc) Narwhal";
      }
    }
    else if (rarity=="Very Rare"){
      if (VRSelect==1){
        return "(Octane) Distortion";
      }
      if (VRSelect==2){
        return "(Merc) Warlock";
      }
      if (VRSelect==3){
        return "Polygonal";
      }
      if (VRSelect==4){
        return "(X-Devil) Snakeskin";
      }
    }
    else if (rarity=="Import"){
      if (ISelect==1){
        return "X-Devil Mk2";
      }
      if (ISelect==2){
        return "Road Hog XL";
      }
      if (ISelect==3){
        return "Pixel Fire";
      }
    }
    else if (rarity=="Exotic"){
      if (ESelect==1){
        return "Lightnings";
      }
      if (ESelect==1){
        return "Lobos";
      }
    }
    else if (rarity=="Black Market"){
      if (BMSelect==1){
        return "Biomass";
      }
      if (BMSelect==2){
        return "Heatwave";
      }
      if (BMSelect==3){
        return "Hexed";
      }
      if (BMSelect==4){
        return "Slipstream";
      }
      if (BMSelect==5){
        return "Parallax";
      }
      if (BMSelect==6){
        return "Labyrinth";
      }
    }
    else{
      cout<<"AN ERROR HAS OCCURED";
    }
  }
  if (crateNum=="CC3"){
    if (rarity=="Rare"){
      if(RSelect==1){
        return "(Breakout) Falchion";
      }
      if(RSelect==2){
        return "(Breakout) Turbo";
      }
      if(RSelect==3){
        return "(Dominus) Mondo";
      }
      if(RSelect==4){
        return "(Octane) Shisa";
      }
      if(RSelect==5){
        return "(Masamune) Oni";
      }
    }
    else if (rarity=="Very Rare"){
      if (VRSelect==1){
        return "(Takumi) Distortion";
      }
      if (VRSelect==2){
        return "(Breakout) Snakeskin";
      }
      if (VRSelect==3){
        return "Troikas";
      }
      if (VRSelect==4){
        return "(Octane) MG-88";
      }
    }
    else if (rarity=="Import"){
      if (ISelect==1){
        return "Breakout Type-S";
      }
      if (ISelect==2){
        return "Hypernova";
      }
      if (ISelect==3){
        return "Dark Matter";
      }
    }
    else if (rarity=="Exotic"){
      if (ESelect==1){
        return "Pulsus";
      }
      if (ESelect==1){
        return "Discotheques";
      }
    }
    else if (rarity=="Black Market"){
      if (BMSelect==1){
        return "Biomass";
      }
      if (BMSelect==2){
        return "Heatwave";
      }
      if (BMSelect==3){
        return "Hexed";
      }
      if (BMSelect==4){
        return "Slipstream";
      }
      if (BMSelect==5){
        return "Parallax";
      }
      if (BMSelect==6){
        return "Labyrinth";
      }
    }
    else{
      cout<<"AN ERROR HAS OCCURED";
    }
  }
if (crateNum=="CC4"){
    if (rarity=="Rare"){
      if(RSelect==1){
        return "(Octane) Dragon Lord";
      }
      if(RSelect==2){
        return "(Venom) Nine Lives";
      }
      if(RSelect==3){
        return "(Road Hog) Carbonated";
      }
      if(RSelect==4){
        return "(Takumi) Whizzle";
      }
      if(RSelect==5){
        return "(Merc) Narwhal";
      }
    }
    else if (rarity=="Very Rare"){
      if (VRSelect==1){
        return "(Octane) Distortion";
      }
      if (VRSelect==2){
        return "(Merc) Warlock";
      }
      if (VRSelect==3){
        return "Polygonal";
      }
      if (VRSelect==4){
        return "(X-Devil) Snakeskin";
      }
    }
    else if (rarity=="Import"){
      if (ISelect==1){
        return "X-Devil Mk2";
      }
      if (ISelect==2){
        return "Road Hog XL";
      }
      if (ISelect==3){
        return "Pixel Fire";
      }
    }
    else if (rarity=="Exotic"){
      if (ESelect==1){
        return "Lightnings";
      }
      if (ESelect==1){
        return "Lobos";
      }
    }
    else if (rarity=="Black Market"){
      if (BMSelect==1){
        return "Biomass";
      }
      if (BMSelect==2){
        return "Heatwave";
      }
      if (BMSelect==3){
        return "Hexed";
      }
      if (BMSelect==4){
        return "Slipstream";
      }
      if (BMSelect==5){
        return "Parallax";
      }
      if (BMSelect==6){
        return "Labyrinth";
      }
    }
    else{
      cout<<"AN ERROR HAS OCCURED";
    }
  }
}

I see right off that you have functions returning string that can exit without returning. This results in the infamous "undefined behavior" that C++ is notable for.

Note that in C++ exiting the function scope without returning does not default-construct a return value. Adding warnings as in the above comments should point them out.

In the else clauses, you have variations of

cout << "AN ERROR HAS OCCURRED";

You should make that

#include <assert.h>

...

string get_stuff() {
    if (something) {
        ...
    } else if (something_els) {
        ...
    } else {
        assert(!"Default case hit");
    }
}

This will stop the program in the debugger in most environments, and print a useful message containing the line number where the default case was hit as well.

As with above advice, you can also walk through with a debugger and watch for yourself as code walks off the end of a function without a return.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM