【问题标题】:Search array for matching result and cout struct members C++搜索数组以查找匹配结果和 cout 结构成员 C++
【发布时间】:2020-04-28 08:29:09
【问题描述】:

完成上学期要求作为期末项目的学业成绩跟踪计划。我没有在它到期之前完成它,我试图理解为什么某些功能没有按我希望的那样运行。

函数 (searchCourse) 旨在搜索结构中的数组。如果找到匹配项,则应将所有结构成员打印给用户。我正在按课程字母代号(即 CIT)搜索。我已经将一个包含三个 CIT 类的文件加载到程序中,并且在调用此函数时,它们无法识别。课程 alpha 指示符是 char 数据类型。如果它是字符串类型并在“for”循环中使用 strcmp,这会更容易完成吗?

//Prompts user to enter course alpha designator for comparison purposes. 
void searchCourse(courses course[])
{
    char desig[3];//User inputs course alpha designator to compare within loop
    //Assigned array value of 4 since strcmp requires 'desig' to have a size for comparison to course[i]
    int i;//Location / loop counter

    cout << endl << "Enter course Alpha-Designator (Ex: CIT, DFIA, etc.): " << endl;//User prompt
    cin >> desig;
    //Set course info headings
    cout << endl;
    cout << left << setw(10) << "Course" << left << setw(25) << "Title" << setw(7) << "Hours" << "Grade" << endl << endl;

    //begin for loop
    for (i = 0; i < courseArrayLength; i++)
    {
       if(course[i].courseName == desig) //If the value in course.courseName is equal to user 'desig'
                                               //Have to use strcmp function when comparing c-strings in array.
                                               //I tried to use the example in CH.8-2 and apply it here. 
        {
            cout << left << setw(4) << course[i].courseName << left << setw(6) << course[i].courseNum;//Print info formatting
            cout << left << setw(25) << course[i].courseTitle << left << setw(7) << course[i].courseHours << course[i].courseGrade << endl;
        }   
        else
        {
            cout << "No courses by that designator.";//Message to display if input 'desig' finds no matches.
            break;
        }
    }

}

如果有人愿意,完整的程序代码在 github 上。任何帮助表示赞赏。这是完成此项目的九个功能中的最后两个。如果我能对如何正确修复这个问题有所了解,那么下一个基本上是相同的。

提前致谢。

【问题讨论】:

  • char desig[3]; 对于CITDFIA 来说都太短了(不管是什么意思)。为什么不使用std::string?此外,对于char[],运算符== 永远不会返回true,除非您与完全相同的数组进行比较(不是一个内容相同的数组,内存中的相同地址)。
  • searchCourse() 的参数是否 是 C 样式的数组?不可以是std::vector吗? courseArrayLength 来自哪里?这不是您的功能的输入。
  • 尽量减少示例并查看上面发布的链接@eerorika
  • 如果if(course[i].courseName == desig) 中的courseNamechar * 而不是std::string,则不能将相等性与== 进行比较,这将导致未指定的行为 --您应该收到警告。如果您不能使用std::string,您可以使用if (strcmp (course[i].courseName, desig) == 0)。将&lt;cstring&gt; 包含在strcmp 中。

标签: c++ arrays struct char


【解决方案1】:
  • desig 不够大:它也必须容纳空终止符。如果允许,请使用std::string。如果没有,请选择一个足够大的数组,例如char desig[ 1024 ]
  • 声明计数器变量ifor语句中for ( int i = 0;…
  • course[ i ].courseName == desig 比较两个指针,而不是两个字符串。使用std::strcmpif ( 0 == strcmp( course[ i ].courseName, desig ) )...。如果您切换到std::string,您可以像以前一样使用比较。
  • 过早地打破循环:当您找到第一个不匹配的课程时(您可能稍后会找到它)。找到第一个匹配项后,您可能希望中断循环:删除 else 并将中断移动到 if 内。

欢迎来到 SO,祝你好运!

【讨论】:

  • 如果他们在嵌入式系统上,只有 nit 是对 OP 的警告,desig[ 1024 ] 对系统来说可能太大了(在普通桌面上,1024/2048 很好)。许多大学现在都在使用微控制器进行教学(如 TI MSP432 等......)否则,做得很好。
【解决方案2】:

感谢大家的回复。我显然是编程新手,这个项目教会了我很多。所有的答案都给了我思考的余地,我最终完成了自己打算做的事情。无论如何,下面的代码可以工作。

void searchCourse(courses course[])
{
    string desig;//User inputs course alpha designator to compare within loop
    //Assigned array value of 4 since strcmp requires 'desig' to have a size for comparison to course[i]
    bool found = false;

    cout << endl << "Enter course Alpha-Designator (Ex: CIT, DFIA, etc.): " << endl;//User prompt
    cin >> desig;
    cout << endl;//Terminal formatting
    cout << left << setw(10) << "Course" << left << setw(25) << "Title" << setw(7) << "Hours" << "Grade" << endl << endl;
    //Format info header
    //begin for loop
    for (int i = 0; i < courseArrayLength; i++)//For loop to process array
    {
        while (i < courseArrayLength)//While array processes...
        {
            if(strcmp(course[i].courseName, desig.c_str()) == 0) //If the value in course.courseName is equal to user 'desig'
                {
                    found = true;//Boolean 'found' is set to true
                    cout << left << setw(4) << course[i].courseName << left << setw(6) << course[i].courseNum;//Print info formatting
                    cout << left << setw(25) << course[i].courseTitle << left << setw(7); 
                    cout << course[i].courseHours << course[i].courseGrade << endl;
                    break;//Required since nested in while loop
                }   

            else if(i < courseArrayLength)//Continue array process.
                {
                    i++;                   
                }
        }
        if(found == false)//If no courses found by user defined designator...
        {
            cout << "No courses by that designator." << endl;//Message to display if input 'desig' finds no matches.
            break;
        }  
    } 
}

【讨论】:

  • 程序自新学期开始以来就已经完成了,但如果有人感兴趣,就在这里:link
猜你喜欢
  • 2019-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多