2013-10-21 4 views
1

그럼 다음 프로그램을 만들어야합니다.문자열에서 제거하고 다른 요소를 가져 오는 방법?

두 개의 "시계"를 HH : MM 형식으로 입력하면 분 간의 차이를 확인하고 출력해야합니다. 그렇다면 어떤 시간이 더 큰 크기인지, 분 단위인지 그리고 출력 시간이 더 큰지 또는 동일한지를 확인해야합니다.

그래서, 나는이 짓을했는지 :

#include <iostream> 
#include <cstdlib> 

using namespace std; 

int main() 
{ 
    string a, b, c, d; 
    int a_min, b_min; 

    getline(cin, a, ':'); 
    cin >> b; 

    getline(cin, c, ':'); 
    cin >> d; 

    a_min = atoi(a.c_str()) * 60 + atoi(b.c_str()); 

    b_min = atoi(c.c_str()) * 60 + atoi(d.c_str()); 

    if (a_min > b_min){ 
     cout << "Razlikata iznesuva " << a_min - b_min << " minuti" << endl; 
     cout << "Pogolemo e prvoto vreme" << endl; 
    } 
    else if (b_min > a_min){ 
     cout << "Razlikata iznesuva " << b_min - a_min << " minuti" << endl; 
     cout << "Pogolemo e vtoroto vreme" << endl; 
    } 
    else if (a_min == b_min){ 
     cout << "Vreminjata se isti" << endl; 
    } 
    return 0; 
} 

을하지만 입력 HH 때 : MM, 내가 가지고 ""는 HH 및 MM 사이에, 그러므로 나는, 단순히 숫자 얻을 수 있도록 나는 시간과 분을 얻고 그들을 개조하는 방법을 도와 주어야한다 (나는 쉽게 추측 할 수 있어야한다) 아니면 이것을위한 대안과 더 좋은 방법이 있다면? 이 같은

+0

흠 이는 C++보다 표준 C 라이브러리 (scanf와)과 매우 쉽게, 그러나 특정 분리기까지 문자열을 읽는있게하는 기능이있다. –

+0

글쎄, 난 불행히도 C에서이 일을해야 + + ... – user2699298

+0

[C에서 문자열을 분할하는 방법에 대한 + +] (http://stackoverflow.com/questions/236129/how-to-split- a-string-in-c/236803 # 236803) –

답변

2
  1. 문자열이 아닌 NUMBERS를 읽어야합니다. 숫자는 숫자가 아닌 때까지 읽기, 그래서 :에서 중지됩니다

    char dummy; 
    int hour, minute; 
    cin >> hour >> dummy >> minute; 
    // check dummy == ':' 
    
  2. 문자열은 공백까지 읽습니다. skipws을 설정하지 않으면 공백 문자를 건너 뛰지 않습니다.

    string hour, minute; 
    getline(cin, hour, ':'); // this will eat the `:` 
    cin >> minute; // assuming whitespace or eof after this 
    // check the values, that you didn't cross eof and such. 
    
+0

좋아, 그래서 내가 시도한거야 :'string a, b, a_min, b_min; char c; getline (cin, a, ':'); cin >> c >> b; cout << a << ""<< b; 입력 12:33에 대해서만 a = 12, b = 3을 얻습니다. 어떤 이유로 b에서 하나의 숫자를 건너 뜁니다. – user2699298

+0

@ user2699298 : 물론 ...; 미안, getline은':'을 먹을 것이다. –

+0

@user :'dummy'를 없애고'getline' 스펙에 "구분 문자가 입력에서 추출되었지만 str에 추가되지 않았습니다." –

0

뭔가 :

int h,m; 
char separator; 
cin >> h >> separator >> m; 
if(separator == ':' && h>=0 && h < 24 && m >=0 && m < 60) 
{ 
    // you have a correct hour 
} 
+0

글쎄,이 경우에는 공간이 있어야 할 것 같습니까? 연산자>, <문자열에 문자열 등을 사용할 수 있습니까? – user2699298

+0

당신은 또한 정규 표현식을 시도 할 수 있습니다. http://en.cppreference.com/w/cpp/regex –

+0

맞아요, 정규식은 여기서 일하지만, 불행히도 아직 배운 적이 없으므로 다음과 같은 대체 옵션이 필요합니다. 가능한 경우 문자열/문자. – user2699298

1

당신을 위해 구문 분석을 할 수있는 std::istringstream를 사용; 이 24 시간 형식으로 타임 스탬프를 기대 :

static unsigned int minutesSinceMidnight(const std::string &timeStamp) 
{ 
    unsigned int hours, minutes; 
    char colon; 
    std::istringstream(timeStamp) >> hours >> colon >> minutes; 
    return hours * 60 + minutes; 
} 

그런 다음 쉽게 두 개의 타임 스탬프를 비교하고 또한 그들이 떨어져있는 시간 (분)을 알 수 있습니다.

+0

'cin'에서 직접 파싱을하지 않으시겠습니까? 모든 스트림에는 동일한 기능이 있습니다! –

+2

@JanHudec :'std :: cin'을 사용하지 않으면 코드 테스트가 매우 간단 해집니다. (모든 종류의 스트림을 지원하려면 아마도'std :: istream'을 직접 사용했을 것입니다). 어쩌면 이것은 나에게있어서 하스켈의 사고 방식 일 수도 있지만, 인수를 순전히 반환 값으로 변환하는 코드와 IO를 수행하는 코드를 분리하려고합니다. –

+0

예, 인수로 istream을 얻는 것이 가장 현명한 방법이 될 것입니다. 테스트가 쉽고 입력에 직접 적용하기 쉽습니다. 그러나 이것은 단지 불필요하게 길어집니다. –

관련 문제