2012-03-29 7 views
-2

저는 C++을 처음 사용하기 때문에 커다란 프로젝트에서 반복적 인 수정 작업을해야합니다. 나는 모든 strcpy 및 strcat 메서드를 가져 와서 sprintf로 변환해야합니다. 그 코드가 작동을하지 않습니다,Strcpy 및 strcat을 sprintf로 수정하는 방법

strcpy(out,in) to sprintf(out, "%s", in) 

strcat(out,in) to do{ int temp = strlen(out); sprintf(out+temp, "%s", in); } while(0) 

첫 번째 질문 : 나는 기본적으로 변환이 될 것이라고 알아 냈어?

두 번째 질문은 out 및 in 변수가 숫자가 될 수없고 % s 대신 % d을 사용해야한다는 것입니다.

세 번째 질문은 수정하려는 모든 코드에서 메소드의 반복마다 변수가 달라 지므로 변수 이름에 유연하게 수정해야합니다. 내가 그것을 할 수있는 어떤 방법이라도? 그것은 VisualStudio 98 프로젝트입니다 ...하지만 리눅스 우분투 및 Windows XP에서입니다.

시간과 제안에 감사드립니다.

아, 그리고 난 다시 내 파일을 만들어 걱정하지 마세요 : D

+2

'strcpy'와'strcat'는 C 문자열을 조작하는 C 라이브러리 함수입니다. 정말로 C++을 배우고 C를 배우고 싶다면 C++의'string' 클래스를 살펴보십시오. –

+0

[폴더의 모든 파일 코드를 수정하는 방법] (http://stackoverflow.com/questions/9914259/how-can-i-modify-code-of-all-files-in-folders) –

+1

"저는 C++을 처음 사용하고 있습니다. 큰 프로젝트에서 반복적으로 수정해야합니다."- 재앙을 대비하는 좋은 방법이라고 할 수 있습니다. –

답변

0

... 당신이하고 싶은 이유를 명확하지

을하지만, 수, 아무튼 그보고에서 첫 번째 작품; 두 번째 것은 do {}를 할 필요가 없으며 (0) 주위에 - tmp local을 유지하기 위해 대신 {}을 사용할 수 있습니다. 그러나 그것이 효과가있는 것처럼 보입니다. 또는

sprintf(out, "%s%s", in); 

을 사용할 수 있으며 자신을 괴롭히지 않게 할 수 있습니다.

그러나 이러한 방법 중 가장 큰 문제는 버퍼 오버플로를 확인하지 않는다는 것입니다. 결과가 유지 될만큼 큰 것이 아니라면? 물론 원래 코드에서 일어날 수 있으므로 아마 검사 할 것입니다.

0

첫 번째 질문은 해당 코드가 작동합니까?

네,하지만 간단 :

strcat(out, in) -> sprintf(out + strlen(out), in) 

두 번째 질문은, 아웃와 변수에 수치 될 수 있다고 나는 % s에 대신 % d 개를 사용할 필요가 절대적 방법은 없습니다 , 권리?

아니요 - strcpystrcat은 문자열 콘텐츠에서만 작동합니다.

외부 변수는 모든 코드에서 메소드의 반복마다 달라 지므로 수정하려면 변수 이름에 유연해야합니다. 내가 그것을 할 수있는 어떤 방법이라도? 그것은 VisualStudio 98 프로젝트입니다 ...하지만 리눅스 우분투 및 Windows XP에서입니다.

그것은 까다 롭습니다 ... 정규 표현식 대체를 사용할 수 있지만 정말 이상한 코드에서는 실패 할 수 있습니다. 또한 선행 처리기와 해시 정의를 사용할 수도 있지만 포함 확장, 전 처리기가 일반적으로 자동으로 작성하는 모든 여분의 기호를 사용하지 않으려 고합니다. 사전 처리기에 대한 명령 행 스위치로 지원 될 수도 있고 지원되지 않을 수도 있습니다 .

얼마나 많은 인스턴스를 변경해야합니까? 너무 많지 않다면, regexp를 시도해보고 수작업으로 리뷰 할 수 있습니다 ....

+0

그것은 많은 다른 파일에 수동으로 확인하는 방법입니다 ...하지만 실제로 어떤 종류의 오류가 strcpy (out, in) sprintf (out, "% s", in) 정의 #define # 내 프로젝트의 헤더에서 strcat (out, in) sprintf (out + strlen (out), "% s", in)를 정의하십시오. 밖으로 나가고 유연하게 할 수있는 방법이 있습니까? 실제 코드에 무엇이 있습니까? – Franko

+0

@Franko : #defines를 사용하면 "in"및 "out"이라는 단어뿐만 아니라 각 사용 시점에서 실제 소스 코드 텍스트를 대체 할 것입니다. 시도해보십시오. –

+0

그것은 작동, 일부 버그가 나타 났습 니다만, 방금 버퍼가 충분히 큰지 확인하는 방법을 만들었습니다. 문제는 아직 발견되지 않았습니다. – Franko