hanmirc   3년 전

qsort함수를 사용해서 문제를 풀려고했는데, 동적할당된 부분을 잘 못읽는거 같습니다.

qsort에 들어가는 1,3번째 인자가 잘못되었는지 출력해보니 단어들이 엉켜있더군요ㅠㅠ

1,3번째를 어떻게 넣어야할까요?

watermelon   3년 전

%s는 문자열 포인터를 입력해야 정상적으로 동작합니다.

문자열은 문자의 배열인데, 문자열의 끝을 '\0' 으로 저장해서 문자열의 끝을 알려주는 역할을 합니다.

질문자님께서 사용하신 것처럼 char의 포인터를 %s 포멧에 입력하게 되면, 컴퓨터는 A의 주소부터 '\0'을 찾을 때 까지 계속해서 출력을 하게 됩니다. 한마디로 의도하지 않게 동작된다는 뜻입니다.

의도하신 대로 동작하기 위해서는 문자를 출력하기 위한 포멧형식인 %c를 사용해서 printf("%c %c \n", *(char*)A, *(char*)B); 라고 바꾸시면 될 것 같습니다.

hanmirc   3년 전

18번 행에서 scanf로 입력받기 때문에 입력 마지막에는 '\0'이 자동으로 입력되는 것으로 알고있습니다.

그래가지구 32번행에서 각 문자가 시작하는 주소값을 전달한 것이었습니다.  혹여나 제가 잘못알고 있는건가요 ㅠㅠ..?

별도로 qsort 3번째 인자 값은 64를 넣으니 정상적으로 작동하였습니다.

각 행에 할당하는 값에 따라 할당되는 크기가 정해지는것으로 생각하고 있는데, 잘못된 부분이 있다면 지적부탁드립니다. ㅠㅠ

watermelon   3년 전

우선 qsort의 첫번째 인자로는 배열명인 list 가 들어가는게 맞을 것 같습니다. list[1] list[2] 이렇게 접근할테니까요.

세번째 인자로는 char*의 크기인 sizeof(*list)를 넣어야 list[1] 의 주소에서 char* 만큼의 주소를 건너뛰어 list[2]로 접근하겠죠?

strcmp 함수는 문제에서 제시하는 조건에 맞지 않는 함수입니다. 문제에선 짧은 문자를 우선순위를 높게 두는데, strcmp는 문자수에 상관없이
첫번째 문자부터 대소비교를 시작하고, 서로 다른 문자가 나올때 까지, 혹은 '\0' '\0' 이 나올때까지 비교를 합니다.

melloc 같이 동적할당을 사용할 경우 타입과 관련해서 문제가 생길 여지가 많기때문에 되도록이면 string 을 사용하시기를 권장드립니다.

watermelon   3년 전

출력관련해서는 질문자님 말이 맞습니다. 자세하게 코드를 보지 않아서 A,B가 문자열을 가르키는지 몰랐네요 ^^;

watermelon   3년 전

올바르게 동작하도록 수정된 코드입니다.

const void* A는 char**, list와 동일한 타입을 갖고 있고, 여기서 참조를 한번 하면 *(char**) = char*로 비교할 문자열의 첫 char을 가르키는 포인터를 가르키게 됩니다.

그러므로 비교해야 할 문자열의 포인터는 *(char**)A 와 *(char**)B 가 됩니다.

A를 char* 로 받을 경우, 비교하게 되는 대상은 *(char*)A 가 되니까, char. 즉 A와 B의 단어의 첫글자만 비교하게 될 것입니다.

hanmirc   3년 전

독학으로 공부 중인데 포인터 부분이 상당히 어렵네요 ㅠㅠㅠ

친절한 설명 정말 감사드립니다!! 좋은하루되세요^^

hanmirc   3년 전

*(char**) = char*로 비교할 문자열의 첫 char을 가르키는 포인터를 가르키게 됩니다.

이 부분 덕분에 정말 속 시원해졌습니다 ㅠㅠㅠ 더 열공하겠습니다!!

댓글을 작성하려면 로그인해야 합니다.