【发布时间】:2014-03-15 05:13:33
【问题描述】:
我正在研究 C++。我正在编写日期格式的代码。使用 with,我们可以从任何其他日期格式中获取默认日期格式。所以我为这个任务找到了 240 种日期格式。所以 M 想使用 switch case 和 sscanf 函数。每个案例都有 sscanf 函数来分隔日、月、年。所以我需要 240 个案例和 240 个 sscanf 函数。有什么方法可以避免大量的 swtich 和 sscanf?如果大家有什么想法,请告诉我。
case 0:
sscanf(tsdate.c_str(),"%2d/%2d/%4d",&day,&month,&year);
break;
case 1:
sscanf(tsdate.c_str(),"%2d-%2d-%4d",&month,&day,&year);
break;
case 2:
sscanf(tsdate.c_str(),"%2d %2d %4d",&day,&month,&year);
break;
case 3:
sscanf(tsdate.c_str(),"%2d/%2d/%2d",&day,&month,&year);
coryear(year);
break;
case 4:
sscanf(tsdate.c_str(),"%2d/%2d/%2d",&year,&month,&day);
coryear(year);
break;
像上面一样,我想放 240 个 case 和 240 个 sscanf。请告诉我如何避免很多情况。
【问题讨论】:
-
为什么有240个案例是个问题?创建起来很乏味,但一旦创建,它应该需要很少的维护,并且总是非常快。
-
y-m、m-d之间的分隔符是否相同?
-
你不能用正则表达式吗?如果您使用它们,您可以专注于数字的顺序,而不必处理分隔符。
-
你能不能也不要扫描分隔符(使用扫描集,如
%[- /]),这样你就可以减少案例的数量。如果做不到这一点,您应该使用结构类型的数组来描述如何处理 240 个案例中的每一个(尽管我承认我不确定您如何获得 240 个选项)。写出 240 个sscanf()语句是……我们应该说“次优”吗?另外,您是否意识到%2d转换规范将允许空格和前导零;它仅表示如果字符串以"123…"开头,则转换后的值将是12,而不是123。您的案例 0 将匹配" 26/ 12/ 23456"。 -
另外,如果您正在使用 POSIX 系统,您应该查看
sscanf()规范中的n$部分。
标签: c++