2012-11-18 1 views
2
내가 (특히, 내가 항목을 제거하는 데 필요한 시간을 테스트입니다) 해시 테이블을 테스트하는 데 사용할 수있는 '키'를 만들려면 다음 코드를 사용하고

다르다 내가 주석으로 표시 한 선에는 이상한 행동이 있습니다. sprintf를 사용하여 "temp_key"의 내용을 "key"로 복사합니다.를 strncpy 동작은 sprintf와의

Printing description of key: 
(char *) key = 0x0000000100103ed0 "Key: 10\xb0\xe7\x03\x01\x10" 

동안 "temp_key는"다음과 같은 출력을 생성 : 그 전에, 나는이 (엑스 코드의 디버거에서 인쇄)했다 "키"를 "temp_key"하지만이 작업에서 얻은 결과의 내용을 복사를 strncpy를 사용 :

Printing description of temp_key: 
(char [20]) temp_key = "Key: 10" { 
    [0] = 'K' 
    [1] = 'e' 
    [2] = 'y' 
    [3] = ':' 
    [4] = ' ' 
    [5] = '1' 
    [6] = '0' 
    [7] = '\0' 
    [8] = '\0' 
    [9] = '\0' 
    [10] = '\0' 
    [11] = '\0' 
    [12] = '\0' 
    [13] = '\0' 
    [14] = '\0' 
    [15] = '\0' 
    [16] = '\0' 
    [17] = '\0' 
    [18] = '\0' 
    [19] = '\0' 
} 

해시 테이블은 memcmp를 사용하여 htable_item_search 함수의 키를 비교합니다. 하지만 strncpy를 사용하면 sprintf를 사용하는 동안 발견되지 않는 항목 (예 : "키 : 10")이 완벽하게 작동합니다. 왜 이런 차이가 있습니까? 소스가 더 이상 납입 이상의 경우 http://www.cplusplus.com/reference/clibrary/cstring/strncpy/

아니 널 문자에서

+0

왜 'strdup'을 사용하지 않습니까? 그것은 정확히'strlen + malloc + strcpy'하지만 하나의 간단한 호출로 수행합니다. 어떤 경우에도 널리 사용됩니다. –

+0

그리고'sprintf'는 false입니다 :'sprintf (temp_key, "Key : % d", i);'를 읽어야합니다. 배열의 &를 사용했기 때문에 경고를 표시하지 않으려면 타입 변환해야했습니다. –

+0

그리고 C에서 함수 서명은'void remove_keys (void)'여야합니다. '()'는 C에서 완전히 다른 것을 의미합니다. C++에서는 괜찮지만 C에서는 그렇지 않습니다. –

답변

3

암시 적 대상의 끝에 추가됩니다 (따라서,이 경우, 대상은 널 (null)이 C 문자열을 종료하지 않을 수 있습니다).

strncpy는 문자열에 널 종결자를 추가하지 않으므로이 함수를 사용하는 동안 문자열의 끝에 쓰레기가 생깁니다.

+0

감사합니다. strncpy를 사용하고 마지막으로 수동으로 널 종료자를 추가합니다. –

+1

당신을 환영합니다! lib 메소드에서 문제가 발생하는 동안 항상 c 참조를 확인하십시오. ^^ 함수 뒤에는 온 세상이 있습니다 ^^ – Rubens