【问题标题】:Transversing an Array of structs error in C++在 C++ 中遍历结构数组错误
【发布时间】:2017-12-22 18:03:44
【问题描述】:

当前代码:

const int MAX_CODENAME = 25;
const int MAX_SPOTS = 5;

struct Team  {    
string TeamName[MAX_CODENAME];  
short int totalLeagueGames;  
short int leagueWins;  
short int leagueLoses;  
}; 

//GLOBAL VARIABLES:
 Team league[MAX_SPOTS];


void addTeams(){
int i = 0; //first loop
int j; //second loop
while(i < MAX_SPOTS){
    cout << "****** ADD TEAMS ******" << endl;

    cout << "Enter the teams name " << endl;
    scanf("%s", league[i].TeamName) ;
}

void searchTeam(){

   string decider[MAX_CODENAME];
   cout << "Please enter the team name you would like the program to retrieve: " << endl;
   cin >> decider[MAX_CODENAME];

for(int i = 0; i < MAX_SPOTS; i++){

    if(decider == league[i].TeamName){

        cout << endl;
        cout << league[i].TeamName << endl;

        break;
    }else{
        cout << "Searching...." << endl;
    }



}

}

我真的不知道为什么它不起作用,但是我已经包含了所有额外的头文件,例如 和 但是当我输入数据然后尝试搜索时程序崩溃了。我得到了死循环,然后 程序没有响应 然后说 进程返回 255 (0xFF) 。它甚至没有输出 Searching.... 一旦我输入该名称,该程序实际上就放弃了。

如果这可以通过使用指针来优化,那就太好了。

tl;dr 运行时错误,一旦我输入名称,就会导致搜索失败。为了记录,我已检查以确保我输入的名称是有效的。

【问题讨论】:

  • 如果你的数组的大小是MAX_CODENAME,那么最后一个元素在索引MAX_CODENAME - 1
  • string TeamName[MAX_CODENAME]; 创建一个字符串数组。我认为一个团队只有一个名字:string TeamName;(假设stringstd::string
  • 使用 iostreams,而不是 scanf。使用 std::vector,而不是数组。

标签: c++ arrays string struct runtime-error


【解决方案1】:

scanf 不知道std::string。使用std::cin &gt;&gt; league[i].TeamName

【讨论】:

    【解决方案2】:
    scanf("%s", league[i].TeamName) ;
    

    这应该改为

    std::cin >> league[i].TeamName ;
    

    这里还有一些其他的东西......

    string decider[MAX_CODENAME];
           cout << "Please enter the team name you would like the program to retrieve: " << endl;
           cin >> decider[MAX_CODENAME];
    

    每次您输入一个值时,您都在告诉计算机将输入的值保存在决策程序[25],但计算机只读取索引 0-24。

    if(decider == league[i].TeamName){
    

    您将团队名称与哪个数组槽进行比较?如果它是第 25 个元素,那么语句应该是

     if(decider[24] == league[i].TeamName){
    

    如果 TeamName 的数量未知,则指针更适合。基于提供的有限代码,我强烈建议您保持在基本数据类型的范围内。出于故障排除的目的,请在以后发布您的完整代码。

    【讨论】:

      【解决方案3】:

      您的TeamName 成员变量:

      string TeamName[MAX_CODENAME];  
      

      是一个25个字符串的数组,所以在这一行:

      scanf("%s", league[i].TeamName) ;
      

      你正在破坏数组。无论如何,您并不真的想要一个数组,所以将 TeamName 声明更改为:

      string TeamName;  
      

      然后当您阅读名称时,您需要使用知道如何填充 string 类型的 iostreams(scanf 仅适用于 c char 数组):

      std::cin >> league[i].TeamName
      

      【讨论】:

        猜你喜欢
        • 2021-03-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-28
        相关资源
        最近更新 更多