다르다 내가 주석으로 표시 한 선에는 이상한 행동이 있습니다. 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/
아니 널 문자에서
왜 'strdup'을 사용하지 않습니까? 그것은 정확히'strlen + malloc + strcpy'하지만 하나의 간단한 호출로 수행합니다. 어떤 경우에도 널리 사용됩니다. –
그리고'sprintf'는 false입니다 :'sprintf (temp_key, "Key : % d", i);'를 읽어야합니다. 배열의 &를 사용했기 때문에 경고를 표시하지 않으려면 타입 변환해야했습니다. –
그리고 C에서 함수 서명은'void remove_keys (void)'여야합니다. '()'는 C에서 완전히 다른 것을 의미합니다. C++에서는 괜찮지만 C에서는 그렇지 않습니다. –