저는 C++을 처음 접했습니다.C++에서 슬래시로 입력 분리하기
(명령 줄에서) A/B 형태로 입력되는 분수에서 분자와 분모를 가져오고 싶습니다. A와 B를 각각의 변수로 가져 오는 가장 쉬운 방법은 무엇입니까?
저는 C++을 처음 접했습니다.C++에서 슬래시로 입력 분리하기
(명령 줄에서) A/B 형태로 입력되는 분수에서 분자와 분모를 가져오고 싶습니다. A와 B를 각각의 변수로 가져 오는 가장 쉬운 방법은 무엇입니까?
가장 쉬운 방법은
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
의를 사용할 때 문제를 방지 할 수있다.
manilator 예제의 경우 +1, "명령 행에서"요청한 명령이므로 – Les
@Les : 명령 행에 대한 좋은 지적 : 이에 대한 설명도 추가했습니다. –
scanf
. C++에서도 여전히 작동합니다. 변수 이름은 소문자로 시작해야합니다.
int a, b;
scanf("%d/%d", &a, &b);
-Removed-By 포스터가 명령 줄을 사용하여 답변을 완료하지 못했습니다.
strtok를 stdtext에서 읽어 들인 후 std에서 읽은 문자열을 분할합니다. C++를 사용
코드를 제거한 후에 남은 것이별로 없습니다. –
명령 줄 인수는 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++는 매우 용서하지 않습니다.
시도해 본 내용을 보여줄 수 있습니까? – Grzegorz