2012-05-02 4 views
3

Beej의 가이드를 IPC으로 확인하고 한 줄의 코드가주의를 끌었습니다.&&/|없이 루프 테스트에서 두 개의 인수를 동시에 사용할 수 있습니까?

특정 페이지에서 speak.c의 while 루프에는 while (gets(s), !feof(stdin))의 두 가지 조건이 있습니다.

그래서 내 질문은 가능한 한 대부분의 시간 동안 한 가지 조건 만 테스트하는 동안 본 것처럼 가능합니다.

추신 : 나는 이것들에 익숙하지 않습니다. 어떤 도움을 주셔서 감사합니다. 감사!

+1

1990 년 이후에'gets '를 사용하는 책/가이드가 발견되면 구워야합니다. 저자는 무능하고 예제를 읽으면 매우 나쁜 습관을 갖게 될 것입니다 ... –

+0

@R .. Beej의 가이드는 @ 왕의 잔학 행위이며 interwebs에서 문질러 줘야하며 따옴표로 묶인 코드는 자신의 전시회 A 여야합니다. 헤이그에서의 자본 재판. – tbert

+0

와우, 정말 그렇게 나빴어. –

답변

6

니핏

while (gets(s), !feof(stdin)) 

먼저 다음이 조건의 결과 인, !feof(stdin)를 테스트 gets(s) 실행의 콤마 연산자를 이용한다.

덧붙여서 은 사용하지 마십시오.은 매우 안전하지 않습니다. 소스를 사용하는 것에주의하십시오. 언어를 배우기에 좋은 소스가 아닐 수도 있습니다. 이 루프 전에 루프 본체 gets의 반복을 피할 수로

코드

while(gets(s), !feof(stdin)) { 
    /* loop body */ 
} 

gets(s); 
while(!feof(stdin)) { 
    /* loop body */ 
    gets(s); 
} 

단지 더 간결한 동일하다.

+0

고마워 !!!. 그것은 나를 정말로 이해하게했다. – Shash

2

이 테스트에서는 comma operator을 사용하며 다음 텍스트 줄을 gets(s)을 사용하고 파일 끝을 !feof(stdin)을 사용하여 테스트하는 방법으로 사용되었습니다.

2

이 구문은 두 표현식을 평가하지 않습니다. 먼저 gets(s)을 실행 한 다음 gets() 함수 호출로 수정할 수있는 !feof(stdin)을 평가합니다.

안전한 기능이 아니며 초보자를위한 읽기가 매우 어려우므로 gets()을 사용하기 때문에 좋은 방법은 아닙니다.

1

@DanielFischer 및 @trojanfoe, 쉼표 연산자에 동의합니다.

한 가지주의 할 점은 일반적으로 위의 질문과 관련하여 특히 사용하고 싶지 않다는 것입니다. 전문 코더라고하면 코드가 읽기 쉽지 않고 다른 개발자에게 혼란 스럽기 때문에 한 가지 파업이 있습니다.

또한 LINT (http://en.wikipedia.org/wiki/PC-Lint)와 같은 정적 코드 분석 도구를 사용하는 경우 경고가 울릴 것이므로 다른 문제가 있습니다. 거기에 전문적인 품질의 코드가 필요한 경우.

마지막으로 @DanielFischer가 지적했듯이 gets()는 전혀 안전하지 않으며 수많은 익스플로잇 및 오버플로 버그를 담당합니다. fgets() 함수를 대신 사용하십시오. fgets() 함수를 사용하면 읽을 문자 수의 상한을 설정할 수 있습니다.

http://www.cplusplus.com/reference/clibrary/cstdio/fgets/

당신은 도착의 항상이 생산 코드 특히, 장소는 fgets()를 사용하는 그것에게 습관을 후회하지 않습니다.

보안 문자열 기능을 살펴볼 수도 있습니다.

http://linux.die.net/man/3/snprintf

그들은 표준 ANSI/C99 C의 일부가 아닌,하지만 당신은 단지 특정 플랫폼 개발하는 경우, 그들은 당신은 당신의 프로그램이나 개방 보안 구멍을 충돌 방지.

행운을 빈다.

+0

의견을 보내 주셔서 감사합니다. 그것을 염두에 두겠습니다. – Shash

3

두 사람이 이미이 문제의 일부를 지적했습니다. 나는 확실히 gets을 사용하는 것이 형편없는 생각이라고 동의합니다.

나는 다른 세부 사항을 언급 할 가치가 있다고 생각한다 : 이것은 루프를 종료하기위한 조건으로 feof(file)을 사용하기 때문에 파일의 끝에서 오류가 발생하면/또한 오동작 할 수있다. 오류가 발생하면 오류 플래그가 설정되지만 (일반적으로) EOF 플래그는 표시되지 않으며 파일에서 더 이상 읽을 수 없으므로 (오류로 인해) 결코 둘 중 하나가 될 수 없으므로 무한 루프가 될 것입니다.

작업을 수행하는 올바른 방법은 fgets로하고, 반환 값 확인 : fgets는 파일 읽기에을 성공을위한

while (fgets(s, length_of_s, stdin)) 
    process(s); 

이 테스트를, 그래서 그것을 위해 루프를 종료 것 중 하나 파일 또는 끝 부분에 오류가 있습니다.

한 기타 사소한 세부 사항 : fgets 문자열을 읽을 때 정상적으로 는 (gets 그것을 버린다) 줄 끝에 새로운 라인을 유지한다. 아마도 줄 바꿈을 제거하기 위해 더 많은 코드를 추가해야 할 것입니다 (줄 바꿈이없는 경우 할당 한 버퍼보다 ​​긴 줄을 처리 할 수도 있습니다).

+0

+1이 코드를 작성하는 올바른 방법을 설명합니다. –

+0

+1 나와 마찬가지로 :) – Shash

+0

코드의 원래 버전은 줄 바꿈에서 끝나지 않은 경우 파일의 마지막 줄을 버리게됩니다. –

관련 문제