당신은 무한 루프를 만듭니다
while (text != '\n') {
...
}
영원히 경우 text
(다소 문자에 대한 잘못된 이름의) 계속 적 '\ n을'다른 무언가로 발생합니다. 일반적인 지침으로, 루프를 만들 때마다 루프 본문이 어떻게 든 루프의 끝으로 진행하고 루프의 끝 부분에 도달했는지 확인해야합니다 (물론 무한대를 만들지 않는 한) lop) 아마도 이걸 없애고 그냥 while (...)
의 몸을 지키고 싶을 것입니다. 외부 루프는 두 가지 조건이 있어야합니다
참고 종료하기 : 당신이 라인의 끝에 도달하면
- 이 종료해야합니다.
- 입력의 끝 부분에 도달하면 종료되어야합니다. 이것은 반드시 개행으로 종료되지는 않습니다. 내가 루프를 작성한다면
는 다음과 같이 보일 것입니다 :
for (std::istreambuf_iterator<char> it(std::cin), end; it != end && *it != '\n'; ++it) {
// do something with the `char` obtained from `*it`
}
을 그것은 또한 당신이 양의 값이 islower()
에 전달되어 있는지 확인해야한다는 것을 주목할 필요가있다 (또는 어떤 <cctype>
의 다른 기능) : char
에 서명 된 시스템이 있습니다. 예를 들어 내 이름에 ü
이 음수 값으로 변환되어 islower('ü')
을 호출 할 때 정의되지 않은 동작을 일으키는 시스템이 있습니다. 이 문제를 피하는 방법은 <cctype>
함수에 전달하기 전에 unsigned char
으로 변환하는 것입니다. static_cast<unsigned char>(c)
의 비트 패턴은 c
의 비트 패턴 (char
이라고 가정)과 동일합니다. char
을 읽는 while
-loop의 원래의 접근 방식을 고집
, 기본 루프 같은 것을 보일 것이다 : 일반적으로
while (std::cin.get(text) && text != '\n') {
if (std::islower(std::static_cast<unsigned char>(text))) {
++count;
}
}
을, 나는 do ... while
-loops 거의으로 살아남을하지 않는 것을 발견했다 프로덕션 코드이며 이것은 예외는 아닙니다. char
을 성공적으로 읽을 수있는 경우에만 루프에 들어가기를 원합니다. 개행 문자는 소문자가 아니기 때문에 직접 입력 할 수도 있습니다. ASCII 문자 std::islower(text)
의 경우 코드가 제대로 작동하도록 작동하지만 코드를 unsigned char
에 추가하여 문제가 발생하지 않도록합니다. 마지막으로, 변수를 증가시키는 C++ 관용구는 역설적으로 사전 증가, 즉 count++
대신에 ++count
입니다. 기본 사용법은 적용되는 유형이 완전히 사소하지 않은 경우 사전 증가가 더 효율적이라는 것입니다. C++에서는 증가하는 반복자를 많이 사용하기 때문에 사전 증가를 사용하는 것이 일반적입니다.
그래서 * *이 무엇을합니까? 마치 무한 루프에 갇히게 될 것 같은데 ...? – MadSkunk