C ++程序if函数中的语句不执行。似乎逻辑错误

时间:2018-04-26 22:06:44

标签: c++ if-statement logic

我正在用C ++制作一个程序,用户在美国标准时间内输入时间并将其转换为军事时间。主代码的主体执行正常,但问题出现在我的函数体中,以if语句开头。我想知道为什么会这样;我对c ++很新。如果您有问题可以随意询问或需要解释该程序应该做什么,这是我的代码。

#include <iostream>
#include <string>
using namespace std;

void militaryConversion(string am_pmPart_st, string firstPartofTime, string secondPartofTime){
    // Converts they obtained strings, but first we must concatenate the two parts into one string
    string concatenatedTime;
    int militaryTime;
    cout << "test1" << endl;

    concatenatedTime = firstPartofTime + secondPartofTime;
    if(firstPartofTime == "12")
        {
        cout << "Corresponding military time is: " << concatenatedTime << " hours" << endl;
        }

    else if(am_pmPart_st == " am")
        {
            if (concatenatedTime.length() < 4){
                cout << "Corresponding military time is: " << concatenatedTime << " hours"<< endl;
            }
        }
    else if(am_pmPart_st == " pm")
    {
        int castedTime;
        castedTime = stoi(concatenatedTime); //This is where we convert the string to int because its the only place it matters
        militaryTime = castedTime + 1200;
        cout << "Corresponding military time is: " << militaryTime << " hours" << endl;
    }

}

int main()
{
    char DELEMETER = ':';
    char DELEMETER_sp = ' ';
    string time, firstPartofTime, secondPartofTime, am_pmPart_st, loweredAM_PM;

    cout << "Enter the time in the format of: HH:MM AM/PM ";
    getline(cin, time);
    firstPartofTime = time.substr(0, time.find(DELEMETER));
    cout << "The first digits of time " << firstPartofTime << endl;
    secondPartofTime = time.substr(time.find(DELEMETER) + 1, time.find(DELEMETER_sp)-1);
    cout << "The second set of digits " << secondPartofTime << endl;
    am_pmPart_st = time.substr(time.find(DELEMETER_sp), time.size());
    cout << "The am/pm part is:" << am_pmPart_st << endl;

    for(int i=0; am_pmPart_st[i]; i++) am_pmPart_st[i] = tolower(am_pmPart_st[i]); //Converts am/pm to lowercase
    cout << am_pmPart_st << endl;

    militaryConversion(am_pmPart_st, firstPartofTime, secondPartofTime);
}

3 个答案:

答案 0 :(得分:0)

首先,你的问题很模糊,因为它确实说明了应该发生的事情。但是,我想我可以看到发生了什么。当您在第一个条件中检查时间的一小部分时,首先检查“12”。但是,你永远不会纠正上午或下午12点。我的建议是检查上午12点(上午12点== 0000点)和下午12点(= 12点1200点)。在上午你将需要检查12并从当时减去1200,在下午你将需要检查12并且不会增加1200时间。

答案 1 :(得分:0)

substr有两个参数。第一个是起始位置,第二个是长度。当您致电secondPartofTime = time.substr(time.find(DELEMETER) + 1, time.find(DELEMETER_sp)-1);时,您错误地将第二个参数作为结束位置传递,而不是长度。

相反,您可以这样做:

int startPos = time.find(DELEMETER) + 1;
int endPos = time.find(DELEMETER_sp) - 1;
secondPartofTime = time.substr(startPos, endPos - startPos + 1);

理想情况下,您应该检查find的返回值,并在返回npos时处理这种情况,这样您就不会因无效的用户输入而崩溃。

答案 2 :(得分:0)

  1. 不遵循HH:MM AM / PM表格的输入正在产生问题。 (HH:MM(包括冒号)正好5个字符)

  2. 您有一个基于if-else的决策树,其中一个if没有else。缺少else是您的程序没有提供任何输出的原因

  3. string.substr()有一些问题,正如MFisherKDX所解释