在c ++程序中显示子字符串

时间:2016-04-19 08:11:57

标签: c++ string

这是一个问题:编写一个程序,允许输入一个表示月份数(1 - 12)的整数,程序应该显示相应月份的缩写。 示例:如果输入为3,则输出应为3月的Mar。 提示:将所有月份缩写存储在一个大字符串中 months =“JanFebMarAprMayJunJulAugSepOctNovDec”

到目前为止,这是我的代码:

#include <iostream>

using namespace std;

int main()
{
    int x;
    string months = "JanFebMarAprMayJunJulAugSepOctNovDec";

    cout << "Enter an integer between (1-12): " << endl;
    cin>>x;

    cout<<"\n"<<months.substr(x,3);
    return 0;
}

问题:无法弄清楚如何获得相应的缩写。

4 个答案:

答案 0 :(得分:3)

#include <iostream>

using namespace std;

int main()
{
    int x;
    string months = "JanFebMarAprMayJunJulAugSepOctNovDec";

    cout << "Enter an integer between (1-12): " << endl;

    cin >> x;

    cout << months.substr((x-1)*3, 3);
    return 0;
}

请参阅:http://ideone.com/0x9amY

注意: 你应该进行边界检查,否则你可能会得到&#39; std :: out_of_range&#39;

此外,存储这样的月份没有任何好处。请改用普通容器:

string months[] = { "Jan", /* and so on */ };

答案 1 :(得分:1)

你快到了那里:

const auto n = 3*(x-1);
const auto &abbr = months.substr(n, 3);
std::cout << abbr << std::endl;

你得到哪一部分?事实上C ++是从零开始的吗?

答案 2 :(得分:0)

您应指定与您正在处理的月份匹配的起始字符,即:

months.substr( 3*(x-1), 3 );

无论如何,这不是更好的方法。为了您的目的,您最好以这种方式使用数组:

const char* month[] = { "Jan", "Feb", ... };
...
cout << month[x-1] << std::endl;

答案 3 :(得分:0)

要“显示子字符串”,您实际上不必使用string创建substr临时字符。相反,您可以write直接std::cout;只需传入指向要打印的第一个字符(即&months[(x - 1) * 3])的指针,以及要打印的字符数:

#include <iostream>
#include <string>
#include <cassert>

using namespace std;

int main()
{
    const string months = "JanFebMarAprMayJunJulAugSepOctNovDec";

    cout << "Enter an integer between (1-12): \n";

    int x;
    if (cin >> x && 1 <= x && x <= 12)
        (cout << '\n').write(&months[(x - 1) * 3], 3);
}