2010-02-23 4 views
2

저는 C89를 처음 사용하여 문자열이 어떻게 작동하는지 실제로 이해하지 못합니다. 나는 7. 다음C : 문자열 관련 문제

내가 자바에서 수행하려고 무엇을 Windows에서 개발하고 :

여기
String hostname = url.substring(7, url.indexOf('/')); 

내 서투른 시도는 C89에서이 작업을 수행하는 것입니다

// well formed url ensured 
void get(char *url) { 
    int hostnameLength; 
    char *firstSlash; 
    char *hostname; 

    firstSlash = strchr(url + 7, '/'); 
    hostnameLength = strlen(url) - strlen(firstSlash) - 7; 
    hostname = malloc(sizeof(*hostname) * (hostnameLength + 1)); 
    strncpy(hostname, url + 7, hostnameLength); 
    hostname[hostnameLength] = 0; // null terminate 
} 

업데이트 hostnamemalloc() 인 답변 (14)의 hostnameLength 들어

을 반영 '31자를 거라고. 왜 이런 일이 생길까요?

+0

@Rosarch, 그 코드는 31을 할당해서는 안되며 15를 할당해야합니다 ... 당신이 보여주고있는 코드가 당신이 실행하고있는 코드인지 확인하십시오. 할당 된 크기를 어떻게 확인하고 있습니까? 나는 방금 도망 가서 당신이 여기있는 것을 테스트했고, 나는 예상 한 결과를 얻었습니다. –

답변

2

// now what?strncpy()입니다 : 그 후

hostname = malloc(hostnameLength + 1); 
strncpy(hostname, url + 7, hostnameLength); 
hostname[hostnameLength] = '\0'; // don't forget to null terminate! 
+0

나는'memcpy'를 개인적으로 사용하고 싶습니다. 어수선하기가 더 어려워 예상치 못한 일을하지 않습니다. 그러나 OP의 코드는 아무도 아직 언급하지 않은'strchr'의 반환 값을 검사 할 필요가 있습니다. –

+0

@Chris는 코드의 다른 곳에 URL이 잘 구성되었는지 여부에 달려 있습니다. –

+0

Reed의 대답에 설명되어있는'malloc()'또는'malloc()'을 사용하고 싶습니까? 네가 너무 작지 않아? –

0

을, 당신은 할 필요가 :

hostname = malloc(sizeof(char) * (hostnameLength+1)); 
strncpy(hostname, url + 7, hostnameLength); 
hostname[hostnameLength] = 0; 

는 복사에 대한 자세한 내용은 strncpy를 참조하십시오. 그것은 당신의 목적지 포인터가 미리 (따라서 malloc) 할당되어야하고, 많은 문자만을 복사 할 것입니다 ...

+0

'hostname [hostnameLength] = 0;'의 의미를 설명 할 수 있습니까? –

+0

예 - 호스트 이름을 null로 종료해야합니다. strncpy는 "hostnameLength"문자를 복사하지만 null 종료 문자는 추가하지 않습니다. 0 (또는 '\ 0')을 추가하면 문자열이 올바르게 종료됩니다. –

+0

C 문자열은 끝에 null 바이트가 필요하며, 복사중인 문자열이 버퍼에 맞지 않는 경우를 다루기 때문에 strncpy는 null을 두지 않습니다. 이렇게하지 않으면 나중에 일부 문자열 연산이 임의의 메모리로 실행되어 프로그램에서 모든 종류의 이상한 작업을 수행 할 수 있습니다 (물론 세분화 오류로 인해 충돌이 발생할 수 있음). –