奇怪的符号打印出来而不是字符串

Weird symbols printing out instead of strings

本文关键字:字符串 符号 打印      更新时间:2023-10-16

我试图制作这个简单的程序来模拟在游戏中打开板条箱。但是,当我运行它时(首先输入 1、2 或 3,然后输入一个大数字,如 100(,它会正确打印出几乎所有内容,但有时(100 次中的一两次(它会打印奇怪的符号而不是它应该打印的字符串。为什么?

#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?nn";
    cin>>crateQuantity;
    cout<<endl;
    string itemActual;
    while(count<crateQuantity){
      certTest=getcert();
      if (certTest!="Null"){
        cout<<certTest<<" ";
      }
      cout<<getitem(crateChosen);
      cout<<endl;
      count++;
    }
    cout<<"nnnYou 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!nn";
    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?nn";
  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";
    }
  }
}

我马上看到你有返回字符串的函数,这些函数可以在不返回的情况下退出。 这导致了臭名昭著的"未定义行为",而C++是值得注意的。

请注意,在C++退出函数作用域而不返回不会默认构造返回值。 如上述评论所示添加警告应指出它们。

在 else 子句中,您有

cout << "AN ERROR HAS OCCURRED";

你应该这样做

#include <assert.h>
...
string get_stuff() {
    if (something) {
        ...
    } else if (something_els) {
        ...
    } else {
        assert(!"Default case hit");
    }
}

这将在大多数环境中停止调试器中的程序,并打印一条有用的消息,其中包含命中默认大小写的行号。

与上述建议一样,您也可以使用调试器演练,并亲自观察代码在没有返回的情况下离开函数的末尾。