-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
감사합니다.
당신은 당신이 그것을 호출 할 때마다'halfSwap()'에 메모리를 새기고 있습니다. –
AFAICS, ['strndup()'] (http://pubs.opengroup.org/onlinepubs/9699919799/functions/strndup.html)의 사양은 두 번째 인수만큼 많은 메모리를 할당한다고 보장하지 않습니다. 입력이 두 번째 인수보다 짧으면 널 종료자를 포함하여 입력에 충분한 공간 만 할당 할 수 있습니다. 따라서 할당 된 공간에 추가하는 것은 정의되지 않은 동작입니다. [Valgrind] (http://valgrind.org/)를 실행할 수있는 플랫폼을 사용하는 경우 사용하십시오. –
코드를 디버깅하여 (예를 들어 * code-blocks *를 통해) 도움을 받으면 스스로 대답을 얻을 수 있습니다. 또한 변수 및 포인터의 값을 디버깅하고 검사하면 더 빨리 학습하는 데 도움이됩니다. – ssd