2012-10-18 2 views
0

저는 C++을 처음 접했습니다.C++에서 슬래시로 입력 분리하기

(명령 줄에서) A/B 형태로 입력되는 분수에서 분자와 분모를 가져오고 싶습니다. A와 B를 각각의 변수로 가져 오는 가장 쉬운 방법은 무엇입니까?

+0

시도해 본 내용을 보여줄 수 있습니까? – Grzegorz

답변

6

가장 쉬운 방법은

double numerator, denominator; 
char dummy; 
if (in >> numerator >> dummy >> denominator) { 
    // ... 
} 

이 상기 스트림의 합리적인 값을 판독한다. 명령 줄에서 인수에서 스트림을 얻으려면, 당신은 사용하십시오 std::istringstream :

int main(int ac, char* av[]) { 
    for (int i(1); i != ac; ++i) { 
     std::istringstream in(av[i]); 
     // ... 
    } 
} 

주요 단점은 분리 문자가 위에서 언급 한 추출 코드와 무엇이든 할 수 있다는 것입니다. 게시 된 버전 :이 솔루션을 이해할 수있을 것 때문에 내가 필요에 따라 당신이 약간 slash()의 구현을 조정할 할 수 있음을 지적하고자,

std::istream& slash(std::istream& in) { 
    if (in.get() != '/') { 
     in.setstate(std::ios_base::failbit); 
    } 
    return in; 
} 
// ... 
if (in >> numerator >> slash >> denominator) { 
    // ... 
} 

: 나는 slash 조작을 사용하는 것이를 해결하려면 분자 바로 다음에 슬래시가 있어야합니다. 최고의 공백을 생략하는 것이 합리적 일 수 있습니다

if ((in >> std::ws).get() != '/') { 
    ... 
} 

또한, 이것은 단지 하나 개의 문자에 대한 특별한 구현 및 다른 문자와 유사한 조종을 할 수 있습니다. 템플릿이 될 수있는 코드를 조작하는 복제 방지하려면 :

template <char Separator> 
std::istream& separator(std::istream& in) { 
    if ((in >> std::ws).get() != std::char_traits<char>::to_int_type(Separator) { 
     // ... 
} 
typedef std::istream& (*separator_manipulator)(std::istream&); 
separator_manipulator const slash = &separator<'/'>; 
separator_manipulator const comma = &separator<','>; 
// ... 

std::char_traits<char>::to_int_type()을 사용할 필요가 음의 값으로 char의를 사용할 때 문제를 방지 할 수있다.

+0

manilator 예제의 경우 +1, "명령 행에서"요청한 명령이므로 – Les

+0

@Les : 명령 행에 대한 좋은 지적 : 이에 대한 설명도 추가했습니다. –

2

scanf. C++에서도 여전히 작동합니다. 변수 이름은 소문자로 시작해야합니다.

int a, b; 
scanf("%d/%d", &a, &b); 
-1

-Removed-By 포스터가 명령 줄을 사용하여 답변을 완료하지 못했습니다.

strtok를 stdtext에서 읽어 들인 후 std에서 읽은 문자열을 분할합니다. C++를 사용

+0

코드를 제거한 후에 남은 것이별로 없습니다. –

0

명령 줄 인수는 C 문자열 (예 : 문자 포인터)로 전달됩니다. 프로그램의 기본 프레임 워크를 가지고 있다면 ...

void main(int argc, char * argv[]) 
{ ... } 

... 또는 이와 비슷한 것입니다. argv 배열의 첫 번째 멤버 (즉, argv [0])는 실행중인 프로그램의 이름에 대한 문자 포인터입니다. 나머지 인수 (argv [1] ~ argv [argc-1])는 명령 행 인수입니다.

c/C++을 배우는 경우 다른 인수를 전달하는 디버거에서 기본 간단한 프로그램을 실행하고 공백이있는 인수를 인용하고 환경 변수를 인수로 사용하고 실제로 전달 된 내용을 시험하기 만하면됩니다

이 기능을 사용하면 A/B를 인수로 사용하십시오. 숫자가 아닌 문자열이되므로 "/"에서 나눌 필요가 있습니다.

int a, b; 
scanf("%d/%d", &a, &b); 

숫자와 슬래시가 모두 하나의 인수로 실행되는 한 계속 작동합니다. 쉘은 일반적으로 다른 인수를 구분하기 위해 공백을 사용합니다.

다른 방법을 사용하여 슬래시와 값을 찾을 수 있습니다. 귀하의 질문에 대한 답변은 C++에만 해당 될 필요는 없습니다. Scanf는 c/C++ 모두에서 작동합니다. 또 다른 간단한 방법에 ... 이제 정수로 변환 할 필요가 값의 캐릭터 라인 형식이

char *copyOfString = strdup(argv[1]); 
char *B = strchar(copyOfString, '/'); 
*B = NULL; 
B++; 
char *A = copyOfString; 

(또는 부동 또는 더블을, 귀하의 요구 사항에 따라 다름)이다. 물론 오류 검사는 없으므로 프로그램을 정확하게 호출하지 않으면 프로그램 적 혼란이 발생합니다.

다른 사람이 다른 방법으로 답변을 게시했지만 다른 사람이 도움이 되었기를 바랍니다. c/C++ 프로그래밍을 환영합니다. 그리고 좋은 책을 얻으십시오, 시행 착오는 지금까지만 가고 C/C++는 매우 용서하지 않습니다.