2012-09-01 4 views
0

내 프로그램을 컴파일하고 실행할 때 "런타임 오류 검사 # 2"오류가 발생하는 것을 제외하면 모든 작업이 정상적으로 작동하는 것처럼 보입니다. 이것은 나의 hw 임무이며, cstring 함수 중 하나를 사용하려고 시도한 것은 처음 이었기 때문에 그것이 잘못되었다고 확신합니다. 기본적으로 나는 2 개의 문자열을 함께 추가하고 있는데, 거의 100 %는 오버런을 일으키는 결과 매개 변수와 관련이 있다는 것을 확신합니다. 그것을 고치는 법을 모른다. num 인수 대상의 전체 크기가 아니다, 그것은 복사 할 바이트 수 있기 때문에strncpy 런타임 검사 오류 # 2 오류 C++

#include <iostream> 
#include <cstring> 
using namespace std; 

void concat(const char a[ ], const char b[ ], char result[ ], int result_maxlength); 
int main() 
{ 
    char a[] = "Woozle"; 
    char b[] = "Heffalump"; 
    char c[5]; 
    char d[10]; 
    char e[20]; 
    concat(a, b, c, 5); 
    concat(a, b, d, 10); 
    concat(a, b, e, 20); 
    cout << c << "\n"; 
    cout << d << "\n"; 
    cout << e << "\n"; 
    return 0; 
} 
void concat(const char a[ ], const char b[ ], char result[ ], int result_maxlength) 
{ 
strncpy (result,a, result_maxlength); 
strncat (result, b, result_maxlength); 
result[result_maxlength-1] = '\0'; 
} 
+1

이전 질문과 다른 점은 무엇입니까? http://stackoverflow.com/questions/12217528/strncat-strncpy-help-c?rq=1 –

답변

1

몇 가지 문제가이 코드에서 지적되었습니다. POSIX 사양에 따르면 strncpy의 동작은 null이 아닌 문자의 수가 지정된 제한에 도달하면 문자열에 null 종결자를 설정하지 않습니다 ('n'). 그러나 'n'에 도달하기 위해 널 (null)을 꼬리 채 웁니다. 따라서 :

char ar[3]; 
strncpy(ar, "food", sizeof(ar)/sizeof(ar[0])); 

이는 (0) = 'F', A (1) = 'O'와 AR (2) = 'O'로 끝날 것이다. null 종결자가 추가되지 않습니다. 마지막으로 무시 된 문자는 무시됩니다. 사람들은이 런타임 라이브러리 함수를 호출하는 것에 대해 아주 기뻐하지 않습니다. 이것을 설명하는 것이 중요합니다. 따라서 종종 이와 같은 코드를 볼 수 있습니다.

char ar[3]; 
strncpy(ar, "food", sizeof(ar)/sizeof(ar[0])-1); 
ar[sizeof(ar)/sizeof(ar[0])-1] = 0; 

아마도 이것은 ar = "fo"와 같이 실제로 찾고자하는 것을 얻을 수 있습니다. 충분한 o 공간 상황은 이것을 뒤집습니다. 충분한 공간이있는 버퍼가있는 경우 복사본의 원본 문자열이 'n'에 도달하기 전에 자체 종료 자에 도달하면 'n'에 도달 할 때까지 'n'이 Null로 끝까지 채 웁니다. 따라서 :

char ar[30]; 
strncpy(ar, "food", sizeof(ar)/sizeof(ar[0])-1); 
ar[sizeof(ar)/sizeof(ar[0])-1] = 0; 

'd'다음에 26 개의 0 문자가있는 ar = "food"가됩니다. 자신의 발가락에 그리 분명 memset 함수를 0으로 호출을 명 유지 :

char ar[30]; 
strncpy(ar, "", sizeof(ar)/sizeof(ar[0])); 

그래, 그 단지 잘못, 나는 알고있다.

strncat()이 당신의 코드가 현재 믿을만한 것을 반영하는 것과 다르게 행동하는 것은 놀랄 일이 아닙니다. 예를 들어, 마지막 매개 변수는 목적지에서 제한 할 문자의 수를 지정하지 않습니다. 오히려 소스에서 복사하지 못하도록 문자의 수를 설명합니다. 즉, 새 문자열을 지속적으로 길들이면 테일 스페이스 리미터가 계속 짧아 져야합니다. 물론, 각 단계마다 복사 된 chars를 추적하는 것이 얼마나 많은지를 알고 누군가가 지적했듯이 strncat 경계선은 많은 경우 쓸모가 없어 유틸리티보다 혼란을 야기합니다.

정의를위한 정확한 정의는 여기 strncpystrncat입니다. 나는 숙제를 계속하기 전에 두 가지에 대해 명확하게 읽을 것을 권고합니다.

+0

정말 고마워요! 그 명확한 설명이 필요했습니다. 나는 아직 프로그래밍에 익숙하지 않지만 많은 의미가 있습니다. –

+0

전혀 문제가 없습니다. 기꺼이 도와주세요. – WhozCraig

1

strncat는 꽤 쓸모가 없다.