1

コードに問題があり、時間を表す文字列データ メンバーを取得し、それが保持するコロンの数で処理し、区切り、整数に変換する方法が関係しています。

目標: 1 ~ 3 個のコロンで区切られた ##:##:##:## の形式で表される一連の時間を取ります (例: 1:13:0:59)。コロン。

ゼロである先頭の曜日と時間のフィールドは省略できるため、0:0:0:12、0:0:12、および 0:12 はすべて「12 秒」の入力形式として受け入れられます。「12」は受け付けません。ただし、値は、秒、分、および時間の従来の制限を超える場合があります。たとえば、 25:3:90 と 1:1:4:30 です。

たとえば、0:01 と入力すると、分全体の値が取得されます。文字列を分解して別の整数を作成する別の方法がわかりません。

これまでの私のコードは次のとおりです。

struct Times {
    int days;
    int hours;
    int minutes;
    int seconds;
    string time;

    void string_to_ints(string& s);
}

void string_to_ints(string& s) {
 // count the amount of colons
 for (int i = 0; i < time.length(); i++) {
     if (time[i] == ':')
     count++;
  }

 // initialize days hours minutes and seconds
if (count == 3) {

    day = time.substr(0, ':');
     d = day.size();
      hour = time.substr( d+1, ':');
       h = hour.size();
        min = time.substr( h+1, ':');
         m = min.size();
          sec = time.substr( m);
           ss= time.size();
 }
// initialize hours, minutes and seconds
if (count == 2) {
   hour = time.substr( 0, ':');
    h = hour.size();
     min = time.substr( h+1, ':');
      m = min.size();
       sec = time.substr( m);
        ss = time.size();
}

// initialize minutes and seconds
if (count == 1) {
   min = time.substr(0, ':');
     m = min.size();
      sec = time.substr( m );
       ss = time.size();
}

// convert the strings to integers
stringstream buffer(sec);
buffer >> seconds;

stringstream buffer2(min);
  buffer2>> minutes;

stringstream buffer3(hour);
  buffer3 >> hours;

stringstream buffer4(day);
  buffer4 >> days;

助けてくれてありがとう。

4

2 に答える 2

1

おそらく、このようなものですか?

#include <iostream>
#include <vector>
#include <string>
#include <sstream>
#include <cstdlib>
#include <algorithm>
using namespace std;

int main() {
    string time_str = "1:13:0:59";
    istringstream iss(time_str);
    string temp;
    int days = 0, hours = 0, minutes = 0, seconds = 0;

    size_t ndelims = count(time_str.begin(), time_str.end(), ':');
    int count = 0;


    if (ndelims == 3) {
        while(getline(iss, temp, ':')) {
            cout << atoi(temp.c_str()) << endl;

            if (count == 0) {
                days = atoi(temp.c_str());
            }
            else if(count == 1) {
                hours = atoi(temp.c_str());
            }
            else if(count == 2) {
                minutes = atoi(temp.c_str());
            }
            else if (count == 3) {
                seconds = atoi(temp.c_str());
            }
            count = count + 1;          
        }
        cout << days << " " << hours << " " << minutes << " " << seconds << endl;
    }
    else if (ndelims == 2) {
        while(getline(iss, temp, ':')) {
            cout << atoi(temp.c_str()) << endl;
            if(count == 0) {
                hours = atoi(temp.c_str());
            }
            else if(count == 1) {
                minutes = atoi(temp.c_str());
            }
            else if (count == 2) {
                seconds = atoi(temp.c_str());
            }
            count = count + 1;          
        }
        cout << days << " " << hours << " " << minutes << " " << seconds << endl;
    }
    else if(ndelims == 1) {
        while(getline(iss, temp, ':')) {
            cout << atoi(temp.c_str()) << endl;
            if(count == 0) {
                minutes = atoi(temp.c_str());
            }
            else if (count == 1) {
                seconds = atoi(temp.c_str());
            }
            count = count + 1;          
        }
        cout << days << " " << hours << " " << minutes << " " << seconds << endl;
    }

    return 0;
}

これは、文字列内の区切り文字の数をカウントし、(':')それを構成要素のトークン (検出された区切り文字の数 + 1) に分割することによって機能します。

次に、右端のトークンは常に秒であり、次に右端のトークンは分などであることに気付き、上記のようにコードを記述できます。これにより、必要なソリューションが得られます

于 2013-10-23T22:59:50.600 に答える
0

strtok を使用して、区切り文字を ":" として使用して文字列を分割します。これは char 配列で機能します。そのため、少しなだめる必要があります。

http://www.cplusplus.com/reference/cstring/strtok/

http://www.cplusplus.com/reference/string/string/c_str/

于 2013-10-23T23:02:47.047 に答える