2010-03-02 3 views
0

쉽게 들리지만 버그가 있으며 그 원인을 모르겠습니다.한 배열의 char 값을 다른 배열의 char 값에 할당

nopunccount = 0; 
char *ra = new char[sizeof(npa)]; 
while (nopunccount <= strlen(npa)) { 
    ra[nopunccount] = npa[strlen(npa) - nopunccount]; 
    nopunccount++; 
} 

ra는 결코 가치가 없으며 npa가 nopunccount 범위 내에서 제공 할 char 값을 가지고 있는지 확인했습니다.

어떤 도움에 감사드립니다 // :

같은 npa 모양의 선언을 무엇
+0

이제 'npa'가 선언 되었습니까? 'strlen (npa)'란 무엇입니까? 작업 코드를 게시하십시오. –

+0

char * npa = new char [sizeof (str)]; str이 함수의 param으로 (char * str) – Spanky

+0

으로 선언되었습니다. 문제가 있습니다 :'sizeof (str)'은 잘못된 결과를 산출합니다 (즉, 포인터의 크기를 산출합니다 * 문자열의 길이가 아닙니다 * !). –

답변

4

nopunccount은 0으로 시작하므로 루프의 첫 번째 반복에서 ra[0]에 할당 된 문자는 npa[strlen(npa)]입니다. 이것은 해당 문자열의 종단 문자 '\0'입니다. 따라서 결과 문자열 ra'\0'으로 시작하므로 일반적인 문자열 함수로 첫 번째 바이트로 끝나는 것으로 간주됩니다.

+0

그루비, 당신은 null 값 중간 문자열을 가질 수 없다는 것을 몰랐지만 그것은 완벽하게 이해할 수 있습니다. 고마워 :) – Spanky

+0

Null은 문자열을 끝내기 때문에 null로 끝나는 문자열은 정의에 의해 문자열 중간에 널을 가질 수 없다. –

2

? 포인터 인 경우 sizeof(npa)은 할당 된 크기가 아니라 포인터의 크기가됩니다. 이러한 문자가 0으로 끝나는 문자열 ("C 문자열"이라고도 함) 인 경우 sizeof이 아닌 strlen을 사용하십시오. 문자열이 아닌 경우 별도의 변수에 할당 한 양을 추적해야합니다.

이 코드에 대한 다른 비판이 있습니다. 아마도이 문제와 관련이 없을 수 있습니다.

while (nopunccount <= strlen(npa)) { 

strlen은 O (n) 연산입니다. 이 코드는 루프 반복마다 문자열 npa을 트래버스합니다. 한 번만 길이를 계산하는 것이 가장 좋습니다.

ra[nopunccount] = npa[strlen(npa) - nopunccount]; 

동일한 문제가 여기에 있습니다.

+0

감사합니다, 좋은 점 :) – Spanky