这是一个问题:编写一个程序,允许输入一个表示月份数(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;
}
问题:无法弄清楚如何获得相应的缩写。
答案 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;
}
注意: 你应该进行边界检查,否则你可能会得到&#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);
}