2017-09-27 6 views
-1

저는 현재 C를 배우고 있으며 문자열의 두 반쪽을 바꿔주는 간단한 함수를 만들기로했습니다. strndmp를 사용하여 문자열의 절반을 얻었고 strncat을 사용하여 나머지 절반을 strndmp 결과의 끝에 추가했습니다. 이 후 출력을 인쇄했습니다. 스크립트는 반을 스왑했지만 마지막 몇 문자는 임의의 문자로 바꾼 문자열을 출력했습니다. 스왑 된 문자열을 인쇄하기 전에 또는 입력 된 문자열이 24 자 미만인 경우 무언가를 인쇄하면 이런 일이 발생하지 않으므로 혼란 스럽습니다. 여기에 코드입니다 :24자를 초과 한 후 strncat 또는 strndmp가 임의의 문자를 추가합니다.

#include <stdio.h> 
#include <string.h> 

void halfSwap(char * sample); 
void halfSwap(char * sample){ 
    char * buff; 
    buff = strndup(sample+strlen(sample)/2,strlen(sample)); 
    strncat(buff,sample,strlen(sample)/2); 
    printf("Sample length: %d\n",strlen(sample)); 
    printf("Buffer output: %s\n",buff); 
} 
int main() { 
    //printf("Uncommenting this will remove the error\n\n"); 
    //Characters only go missing after sample exceeds 24 chars 
    halfSwap(" worrrrrrrlddhellllllllooo"); 
    //Error does not occur after printng once 
    halfSwap(" worrrrrrrlddhellllllllooo"); 
} 

그리고 출력은 다음과 같습니다 사전에

Sample length: 26 
Buffer output: hellllllllooo worrrrrrrl 
Sample length: 26 
Buffer output: hellllllllooo worrrrrrrldd 

감사합니다.

+0

당신은 당신이 그것을 호출 할 때마다'halfSwap()'에 메모리를 새기고 있습니다. –

+1

AFAICS, ['strndup()'] (http://pubs.opengroup.org/onlinepubs/9699919799/functions/strndup.html)의 사양은 두 번째 인수만큼 많은 메모리를 할당한다고 보장하지 않습니다. 입력이 두 번째 인수보다 짧으면 널 종료자를 포함하여 입력에 충분한 공간 만 할당 할 수 있습니다. 따라서 할당 된 공간에 추가하는 것은 정의되지 않은 동작입니다. [Valgrind] (http://valgrind.org/)를 실행할 수있는 플랫폼을 사용하는 경우 사용하십시오. –

+0

코드를 디버깅하여 (예를 들어 * code-blocks *를 통해) 도움을 받으면 스스로 대답을 얻을 수 있습니다. 또한 변수 및 포인터의 값을 디버깅하고 검사하면 더 빨리 학습하는 데 도움이됩니다. – ssd

답변

0

strndup를 호출하면 문자열의 후반부 만 충분한 메모리가 할당되므로 strncat을 사용하면 buff에 할당 된 공간을 초과하여 동작이 정의되지 않습니다. 이 라인들을 따라 무엇인가를 원할 것입니다 :

int len = strlen(sample); 
int half = len/2; 
buff = (char*)malloc(len+1); 
strcpy(buff,&sample[half]); 
strncat(buff,sample,half);