2009-11-11 3 views
0

문자열에 C++ 주석 (멀티 라인 및 싱글 라인)이 포함되어있을 수도 있고 없을 수도 있습니다. 그런 문자열을 사용하기 전에 주석을 제거해야합니다. 현재 나의 생각은 NSScanner를 사용하여 다중 행 주석을 열고 닫는 위치를 찾고 문자열의 해당 부분을 삭제하고 한 줄 주석 및 EOL 문자를 열고 문자열의 해당 부분을 삭제하는 것입니다 .NSScanner를 사용하여 문자열에서 주석을 삭제 하시겠습니까?

다르게하겠습니다. 당신의 접근 방법은 무엇입니까? 중요한 경우 문자열의 크기가 수 메가 바이트가 될 수 있으므로 성능이 문제가됩니다.

답변

0

내 솔루션 :

은 NSScanner를 사용하여 캐릭터를 이동하고 각 멀티 라인의 위치를 ​​표시하고 단일 주석 및 모든 문자열 (작은 따옴표와 큰 따옴표 사이의 모든 것). 각 항목의 범위를 나타내는 NSValue의 배열에 위치를 저장하십시오.

그런 다음 각 주석이 문자열 안에 있는지 확인하면서 주석 배열을 반복합니다. 이것을 확인하는 방법은 각 주석의 위치가 각 문자열의 위치보다 크지 않고 주석의 위치가 각 문자열의 위치 + 길이에 속하지 않는지 확인하는 것입니다.

그리고. 빠진 항목은 유효한 주석이므로 안전하게 삭제할 수 있습니다.

1

this thread에서 나는 최선의 제안이 C++ 전 처리기를 통해 문자열을 실행하는 것이라고 생각했습니다.

+0

문자열에'# include ','# define','# etc' 지시어가 있으면 좋지 않은 부작용이있을 수 있습니다. – mob

+1

사용자가 자신의 시스템에 개발자 도구를 설치하지 않았을 수 있습니다. – ruipacheco

0

따옴표를 추적하는 것을 잊지 마십시오. 테스트 케이스 :

  • "/*Ceci n'est pas une commentaire*/"
  • '/**/' (문자 맥 OS/맥 OS X OSType)이 모든 경우에
  • "This string does not contain a // comment"

  • '//!\n', 당신은 코멘트를 감지하지합니다 .

    반대의 경우도 마찬가지입니다 :

    • //Ceci n'est pas une "string"
    • /*This comment does not contain an OS'Type' literal*/
  • +0

    네, 압니다. 누가 소프트웨어가 쉽다고 말했습니까? – ruipacheco

    관련 문제