strncpy
은 지정한 한도까지 데이터를 복사합니다. 그러나 문자열 끝에 도달하면 그 범위는 으로 변경되지 않고으로 끝납니다.
즉, strncpy
에는 두 가지 가능성이 있습니다. 하나는 어쨌든 strcpy
과 같은 동작을 얻게된다는 것입니다 (느린 것은 제외하고 NUL로 목적지 버퍼의 나머지 부분을 채 웁니다. 사실상 실제로는 원하지도 신경 쓰지도 않습니다). 다른 하나는 일반적으로 실제 사용할 수없는 결과를 산출한다는 것입니다.
는 고정 길이 버퍼에 최대 길이에 문자열을 복사 할 경우 (예를 들어) sprintf
를 사용하는 작업을 수행 할 수 있습니다 strncpy
달리
char buffer[256];
sprintf(buffer, "%255s", source);
, 항상이 을 결과를 제로 종료 (zero-terminate)하므로 결과는 항상 문자열로 사용 가능합니다.
당신이 sprintf
(또는 유사)를 사용하지 않으려면, 그냥 실제로 당신이 일반적인 순서에 뭔가 원하는 것을 그 함수를 작성 좋을 걸 :
void copy_string(char const *dest, char const *source, size_t max_len) {
size_t i;
for (i=0; i<max_len-1 && source[i]; i++)
dest[i] = source[i];
dest[i] = '\0';
}
당신이 후로을 이 C++ (C 이외에) 태그 : 내 조언은 일반적으로 그냥이 std::string
사용하여 C++에서이 모든 엉망을 피할 것입니다.
당신이 정말로 C++에서 NUL 종료 순서로 작업해야하는 경우, 당신은 또 다른 가능성을 고려해 볼 수 있습니다 :
template <size_t N>
void copy_string(char const (&dest)[N], char const *source) {
size_t i;
for (i=0; i<N-1 && source[i]; i++)
dest[i] = source[i];
dest[i] = '\0';
}
대상이 실제 배열 (안 포인터)는이 비로소 작동하지만에 대한 이 경우 사용자가 명시 적으로 전달해야하는 대신 컴파일러에서 배열의 크기를 추론합니다. 이것은 일반적으로 코드를 매우 빠르게 (함수 호출에서 오버 헤드가 적게) 빠르게 만들고 엉망으로 만들고 잘못된 크기를 전달하는 것이 훨씬 더 어렵습니다.
여기에서 답을 찾을 수 있습니다 (http://stackoverflow.com/questions/1258550/why-should-you-use-strncpy-instead-of-strcpy) –
이유는 그것은 당신이 생각하는 것을하지 않는다는 것입니다. – immibis
어떤 목적으로도 strncpy를 사용하면 안됩니다. 본질적으로 안전하지는 않습니다 ([this this] (http://stackoverflow.com/questions/2114896/why-are-strlcpy-and-strlcat-considered-insecure)). 대신에,'strcpy'를 버퍼 크기 검사와 함께 사용하십시오. – Lundin