该字符串重整器使用什么而不是substr?

时间:2017-06-20 20:25:21

标签: c++ string c++11 tokenize substr

所以我的教授告诉我,我必须重做我的代码,因为我在代码中使用了substr函数来完成它。此代码使用一项功能将用户在 2017年10月5日之类的日期重新格式化为 2017-02-05 。有没有人对如何绕过这个c ++程序使用substr有任何想法?通过以下代码非常感谢任何帮助:

#include <iostream>
#include <vector>
#include <sstream>
#include <cstdio>

using namespace std;

string reformatDate(string oldDate) {
    string finalDate;
    int d = 0;
    int m;
    int y = 0;
    string month[12] =  {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
    int i;
    for (i = 0; i < oldDate.length(); i++) {
        if(oldDate[i] >= '0' && oldDate[i] <= '9') {
            d = d*10 + oldDate[i] - '0';
        } else {
            break;
        }
    }
    i = i+3;
    for(m = 1; m <=12; m++) {
        if(month[m-1].compare(oldDate.substr(i,3)) == 0) {
            break;
        }
    }

    for(i=i+4; i<oldDate.length(); i++) {
        if((oldDate[i] >= '0') && (oldDate[i] <= '9')) {
            y = y*10+ oldDate[i] - '0';
        } else {
            break;
        }
    }

    char str[20];
    sprintf(str, "%d-%02d-%02d", y, m, d); // formats date into YYYY-MM-DD format
    finalDate = finalDate + str;
    return finalDate;
}

int main() {
    string s;
    cout << "Enter date: ";
    getline(cin, s);

    cout << "Reformated Date: " << reformatDate(s) << endl;
}

正如你所看到的那样,我只使用了一次substr由于这一行而必须重做整个事情会很痛苦。所以我需要的是一种解决方法,以使相同的代码在没有substr的情况下工作。谢谢!

2 个答案:

答案 0 :(得分:0)

编写自己的方法,以实现与announcement相同的功能。

这是我的看法,但我鼓励你尝试写一个,这就是为什么你的教授告诉你重写代码=)

std::string mysubstr(std::string& str, size_t pos, size_t len)
{
    std::string sub_str = "";
    for(size_t i = 0; i < str.size(); ++i)
    {
        if(i == pos)
        {
            for(size_t j = 0; j < len; ++j)
                sub_str += str[i++];
            break;
        }
    }
    return sub_str;
}

它可以在您的代码中使用,如下所示:

if(month[m-1].compare(mysubstr(oldDate, i, 3)) == 0)

或者像这样:

if(month[m-1] == mysubstr(oldDate, i, 3))

并为给定的输入生成相同的精确输出。

答案 1 :(得分:0)

对于不了解很多功能的人来说,这是一种简单的方式...... 当然可以做得更轻松,但我认为你的教授想用这么简单的方法测试你......祝你好运!

i = i+1;
int k;
int count;
for(m = 1; m <=12; m++) {
  for(k=0; k<3;k++) {
      if(month[m-1][k] == oldDate[i+k]) {
          count++;
      }
   }
   if (count==3)
      break;
   else
       count=0;

}