2009-12-15 3 views
0

복수 선택 기능이있는 GetOpenFileName을 사용하고 있습니다. 선택한 파일은 LPSTR로 반환됩니다. 이 LPSTR 내부에서 선택된 파일은 NULL 바이트로 구분됩니다. LPSTR을 배열로 분할하고 그 배열을 반복하고 싶습니다.NULL 바이트가있는 C 문자열을 문자 배열로 바꿈

$array = explode("\0", $string); 

을하지만 C에 새로운 오전 이후, 나는 내가하는 일 아무 생각이 :

PHP에서 나는 할 것이다.

+1

최소한 시도해보십시오. – shoosh

+1

@Shoosh : 나는 포인터 등을 배울 수있는 유일한 방법으로 동의하고 싶다.;) – t0mm13b

+0

여기서 대부분의 솔루션은 파일 목록의 끝에 두 번 null이 있다는 것을 명심해야한다. – Jherico

답변

3

당신은 문자열을 통해 루프에이 작업을 수행 할 수 있습니다 : 그것은 정말 필요하다면

char *Buffer;    // your null-separated strings 
char *Current;   // Pointer to the current string 
// [...] 
for (Current = Buffer; *Current; Current += strlen(Current) + 1) 
    printf("GetOpenFileName returned: %s\n", Current); 

당신은 배열을 만들려면이 코드를 적용 할 수 있습니다.

+0

LPSTR이 * 2 * null 문자로 끝나는 경우에만 작동합니다. 그렇지 않으면 0과 같은 두 개의 연속 바이트로 실행될 때까지 또는 segfault가 발생할 때까지 메모리 덩어리를 계속 출력합니다. –

+0

사실입니다. 그러나 버퍼는 실제로 두 번 null로 종료됩니다. MSDN에서 GetOpenFileName을 참조하십시오. –

+0

이것이 나에게 효과가있는 유일한 방법입니다. 고맙습니다. –

1

문자열 복사가 도움이 되겠습니까?

 
LPSTR ptrFileName; 
char buf[100]; 
strcpy(buf, ptrFileName); 
/* Now iterate */ 
for (int nLoopCnt = 0; nLoopCnt < (sizeof(buf)/sizeof(buf[0])); nLoopCnt++){ 
    char ch = buf[nLoopCnt]; 
    /* Do whatever with ch */ 
} 

희망이, 안부, 톰을하는 데 도움이됩니다.

3

가장 쉬운 방법은 반환 된 문자열을 직접 반복하는 것입니다. (별도의 배열을 만들 필요가 없습니다.) 코드는 다음과 같이 (오류가 생략 검사) 보일 것이다 : 사용자가 여러 개의 파일을 선택하면, 첫 번째 항목이 될 것 잊지 마세요,

GetOpenFileName(&ofn); 

LPSTR pszFileName = ofn.lpstrFile; 

while(*pszFileName != 0) 
{ 
    // do stuff... 
    pszFileName += strlen(pszFileName) + 1; 
} 

도를 폴더 이름

+0

그건 작동하지 않습니다. 왼손 할당을 할 수없는 '+ ='에 대한 오류가 나옵니다. –