adfsfsf   5년 전

문자열 정렬 함수를 아래와 같이 설정하고서 qsort 함수를 실행했는데 첫 수만 정렬되지 않았습니다.

djm03178   5년 전

호출하는 쪽이 더 중요합니다.

그보다는 전체 코드를 올리는 편이 더 좋습니다.

adfsfsf   5년 전

전체 소스입니다.

djm03178   5년 전

sizeof(nnum)은 동적할당 받은 크기를 반환해주는 게 아닙니다. 이는 sizeof(char **)이랑 똑같은 말입니다. 즉, 포인터 하나의 크기입니다.

sizeof는 컴파일 시간에 값이 결정되는 상수라는 것을 기억해두세요.

djm03178   5년 전

한 가지 더, int_cmp의 a, b는 nnum의 각 원소의 주소입니다. 그래서 그 주소가 가지고 있는 char 포인터의 값을 얻어오려면 a, b가 아니라 *a, *b의 값을 얻어와야 합니다.

즉, 다음과 같이 해야 합니다.

adfsfsf   5년 전

전부 수정했습니다. 그럼에도 첫 수가 정렬되지 않습니다.

djm03178   5년 전

괄호 앞에 별 안 붙이셨습니다.

애초에 첫 수만 빼놓고 정렬된 게 아니라, 아예 정렬 자체를 안 한 상태가 그 상태인 겁니다.

adfsfsf   5년 전

그렇군요. 감사합니다. 하지만 저는 이렇게 바꿨습니다. 드디어 m과 n에 각각 문자열이 제대로 들어갔고, 정렬도 되었습니다. 그런데 출력을 문자로 하면 안 되는 건가요?

djm03178   5년 전

출력을 문자로 하면 안 된다는 게 무슨 뜻인가요? 어떻게 쓰셨는지 보여주셔야 압니다. 이 코드는 잘 돌아가네요.

adfsfsf   5년 전

코드가 정상 동작하는데도 틀렸다고 뜨네요. 그래서 다른 질문 글을 보니까 strcmp가 단순히 음수 혹은 양수를 반환할 뿐이지 -1과 1로 항상 반환하지는 않는다더라군요. 그래서 새로 고쳐보았습니다. 하지만 이 코드 또한 틀렸다고 합니다.

djm03178   5년 전

strcmp는 -1이나 1이 아닌 음수 / 양수를 반환할 수 있지만 qsort에는 그렇게 돌려줘도 상관 없습니다. 애초에 compare 자체가 -1, 1이 아니라 음수 / 양수로 대소 관계를 파악하는 개념입니다. int_cmp 함수가 음수로 -5나 -1234567을 돌려줘도 되고, 양수로 100000000을 돌려줘도 괜찮습니다.

이 코드에서 전체적으로 간과한 사실이 있는데 문자 배열에 문자열을 담으려면 그 길이보다 1 더 큰 공간을 할당해 줘야 하는데 전부 strlen 만큼만 할당하고 있어 배열의 범위를 벗어나게 됩니다. 23, 41, 61번째 줄에 모두 +1을 해주면 맞게 나옵니다.

adfsfsf   5년 전

그렇군요. VS에서는 자동적으로 추가 할당해줘서 지나쳐버렸네요. 감사합니다.

djm03178   5년 전

추가 할당을 해줬다기보다는 원래 운영체제가 메모리를 할당해줄 때 칼같이 요구한 만큼만 할당해주는 것이 아니고, 운이 작용해야 됩니다. 특히나 동적 할당은 정확히 어느 메모리에 할당될지 알 수가 없습니다. 운이 나쁘면 segmentation fault가 날 수도 있고, 프로그램이 사용하던 다른 변수값을 건드려서 에러는 안 나지만 동작이 이상해질 수도 있고, 그냥 메모리 사이에 껴들어있던 여유 공간을 써서 아무런 문제가 안 생길 수도 있죠.

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