C++ 根据特定字符串更改程序中的一个单词
所以我正在写一个程序,我想要一些用户输入。假设我们定义了一个int;叫做年龄。如果用户是成年人(比如说30岁以上),我希望程序将所有非正式的“you”替换为荷兰语中的“formal”you(许多语言,比如法语,都有这种区别,比如vous vs tu),“u”是正式的,而不是“je” 最简洁的方法是什么?我现在有这个(使用今天的日期,2015年9月18日):C++ 根据特定字符串更改程序中的一个单词,c++,date,C++,Date,所以我正在写一个程序,我想要一些用户输入。假设我们定义了一个int;叫做年龄。如果用户是成年人(比如说30岁以上),我希望程序将所有非正式的“you”替换为荷兰语中的“formal”you(许多语言,比如法语,都有这种区别,比如vous vs tu),“u”是正式的,而不是“je” 最简洁的方法是什么?我现在有这个(使用今天的日期,2015年9月18日): 我很确定它是有效的,但可能是次优的。我该如何改进这一点?如果没有适当的表扬,阅读起来相当困难。在你的代码中,你必须获得一些荣誉。但要让它短一
我很确定它是有效的,但可能是次优的。我该如何改进这一点?如果没有适当的表扬,阅读起来相当困难。在你的代码中,你必须获得一些荣誉。但要让它短一点,也会让它看起来更好
string abc = "je";
if (2015 - year of birth > 30) abc = "u";
else if ( 2015 - year of birth == 30){
if ( September - month of birth > 0) abc = "u";
else if (September - month of birth == 0){
if (18 - day of birth >= 0) abc = "u";
}
}
现在您有了字符串abc
作为“je”
。这样,你就不需要其他的了。如果其中一个条件为真,则表示为“u”。应该是一样的
编辑:
实际上,像杰里米的回答那样做更好。你可以像这样做
string abc="u";
if ((2015 - year of birth < 30) ||
(2015 - year of birth ==30 && September- month of birth < 0) ||
(2015 - year of birth ==30 && September- month of birth ==0 && 18 - day of birth < 0))
abc ="je";
字符串abc=“u”;
如果((2015年-出生年份<30岁)||
(2015年-出生年份==30和9月-出生月份<0)||
(2015年-出生年份==30岁和9月-出生月份==0岁和18岁-出生日<0))
abc=“je”;
最简单的方法是实现/使用“两个日期之间的天数”功能。如果几天内的错误对您的任务是可接受的,您可以这样使用它:
int difference = currentDate - birthday; // nb of days between today and birthday of user
abc = (difference >= 30 * 365) ? "u" : "je"; // 365 is approx. number of days in a year
为此,您可以阅读以下问题:
你想要达到的是,如果某个人的一天超过30年,那么字符串将是,
abc='u'
,否则它将是abc=“je”
现在您使用的方法是静态的,即您在程序中使用特定日期。您可以在C++中使用<代码> cTime/Cuo>库很容易地解决上述问题。
这是您正在搜索的程序。我希望这会有所帮助:)我想你可能真的需要与今天的日期进行比较,所以使用
std::chrono
和-后者将日期解压成一个给你的:请在链接的文档中注意,年和月分别以1900和0为基础
可以方便地将值分组为一个元组
,以便于比较,这样,如果最左边的值相等,它将考虑右边的值,依此类推
auto now = std::chrono::system_clock::now();
auto my_time_t = std::chrono::system_clock::to_time_t(now);
std::tm* p = std::localtime(&my_time_t);
string abs = std::tie(p->tm_year + 1900 - 30, p->tm_mon + 1, p->tm_mday) >
std::tie(year_of_birth, month_of_birth, day_of_birth)
? "je" : "u";
如果您实际上不需要今天的日期,只需去掉前3行,硬编码
p->tm_xxx+…
值。首先,我会将出生日期转换为自纪元起的毫秒,并与自纪元起的当前时间进行比较。这将大大简化您的代码,因为您将有一个地址类型测试
这个线程解释了这个过程
然后你可以简单的
如果(ageInMillistics>=FormalAgeinMillistics)谢谢,我需要编写代码“两个日期之间的天数”的演示文稿-只要你不关心闰年,或者考虑到这一点,而不是使用建议的
30*365
,是的。@TonyD,谢谢你指出这一点!是的,我想,在这项任务中,几天之内犯下的错误是可以接受的。我已经更新了我的答案。
auto now = std::chrono::system_clock::now();
auto my_time_t = std::chrono::system_clock::to_time_t(now);
std::tm* p = std::localtime(&my_time_t);
string abs = std::tie(p->tm_year + 1900 - 30, p->tm_mon + 1, p->tm_mday) >
std::tie(year_of_birth, month_of_birth, day_of_birth)
? "je" : "u";