안녕하세요! C언어 관련해서 질문 드려요~

KNK C프로그래밍 예제 풀다가 막혀서 질문드립니다.
주어진 단어들을 받아서 정렬하여 되돌려주는 코드를 짜고 있는데요, 다음과 같은 형식입니다.

Enter word: foo
Enter word: bar
Enter word: baz
Enter word: quux
Enter word:

In sorted order: bar baz foo quux

코드를 한번 짜봤는데요,

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

#define MAX_LEN 20
#define MAX_WORD 10

/* 입력되는 문자들을 읽고, 문자열로 반환합니다.*/
int read_line(char str[], int n)
{ 
  int ch, i = 0;
  
  while ((ch = getchar()) != '\n')
    if (i < n) 
      str[i++] = ch;
    str[i] = '\0';
    return i;
}


int compare(const void *p, const void *q)
{ 
  return strcmp((char *)p, (char *)q);
}


int main(void)
{
  char word_str[MAX_LEN+1];
  char *words[MAX_WORD];
  int i, word_num = 0;

  while (1) {
    printf("Enter word: ");

    read_line(word_str, MAX_LEN);

    if(word_str[0] == '\0') break;

    words[word_num] = malloc(strlen(word_str));
    strcpy(words[word_num], word_str);

    word_num++;
  }

  qsort(words, word_num, strlen(word_str) , compare);

  printf("In sorted number: ");

  for (i = 0; i < word_num; i++)
    printf("%s ", words[i]);

  printf("\n");
  return 0;
}

코드는 실행되지만, 단어들이 정렬이 되지 않고 그대로 나옵니다. 어느 부분들이 잘못된 건가요???

  1. compare함수에서 strcmp((char *)p, (char *)q); 이렇게 두면 내림차순으로 돼서
    -(strcmp((char *)p, (char *)q));이렇게 바꾸고

  2. qsort에서 세번째인자는 정렬할 배열의 요소의 크기여서 sizeof(char *)로 넣어야합니다.
    (배열 요소가 문자열이여도 문자 전채를 바꾸는게 아니라 배열에서 주소의 위치만 바꾸면 됩니다)

  3. qsort에서 주소를 바꿔야하기 떄문에 &words로 해야합니다.

감사합니다! 혹시 잘 실행되시나요?? 얘기해주신대로 바꿔봤는데 저는 실행이 잘 안되네요…

1 Like

죄송해요… 아깐 저도 잘된 것 같았는데… 지금은 또 잘 안되네요…
일단 3번이 잘못된 것 같아요.
&words로 바꾸면 words의 주소를 바꾸갰다는 소리가 되서…
최대한 빨리 다시 고쳐서 오겠습니다.

이러면 안될 것 같지만 qsort부분에서 계속 이상하길래 그냥 퀵솔트하나 정의해서 했습니다.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#pragma warning (disable : 4996)

#define MAX_LEN 20
#define MAX_WORD 10

/* 입력되는 문자들을 읽고, 문자열로 반환합니다.*/
int read_line(char str[], int n)
{
	int ch, i = 0;

	while ((ch = getchar()) != '\n')
		if (i < n)
			str[i++] = ch;
	str[i] = '\0';
	return i;
}

//arr : string array, strt : start index, end : end index
void qisort(char* arr[], int start, int end) {
	if (start < end) {
		char* temp;
		int i = start+1, j = end, pivot = start;

		while (i <= j) {
			while ( i <= j && strcmp(arr[i], arr[pivot]) < 0 )i++;
			while (i <= j && strcmp(arr[j], arr[pivot]) > 0)j--;
			if (i > j) break;
			temp = arr[i]; arr[i] = arr[j]; arr[j] = temp;
		}

		temp = arr[pivot];
		arr[pivot] = arr[j];
		arr[j] = temp;

		qisort(arr, start, j-1);
		qisort(arr, j+1, end);
	}
	return;
}



int main(void)
{
	char word_str[MAX_LEN + 1];
	char* words[MAX_WORD] = {0,};
	int i, word_num = 0;

	while (1) {
		printf("Enter word: ");

		read_line(word_str, MAX_LEN);

		if (!word_str[0]) break;

		words[word_num] = malloc(strlen(word_str));
		strcpy(words[word_num], word_str);

		word_num++;
	}

	qisort(words, 0, 2);

	printf("In sorted number: ");

	for (i = 0; i < word_num; i++)
		printf("%s ", words[i]);


	printf("\n");
	return 0;
}
1 Like

아 퀵정렬 새로 정의하셨군요…ㅎㅎㅎㅎㅎ 도와주셔서 감사합니다~!!

1 Like

감사합니다ㅎㅎ.
그렇지만 qsort쓰는법 못찾아와서 죄송해요ㅠ.
그리고 qisort(wards,0,word_num-1);로 고치는거 깜빡했어요…

2 Likes
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_WORD 10

char* read_line()
{
	char s[ 80 ];
	char* p = s - 1;
    while( ++p, ( *p = getchar() ) != '\n' );
    *p = 0;
    return  strcpy( malloc( p - s + 1 ), s );
}

int _strcmp( const void* p, const void* q )
{
    return  strcmp( *(char**)p, *(char**)q );
}

int main()
{
    char *words[ MAX_WORD + 1 ];
    int  i, words_n = 0;

    do  puts( "Enter word: " ), words[ words_n++ ] = read_line();
    while( words[ words_n - 1 ][ 0 ] );
    --words_n;

    qsort( words, words_n, sizeof words[ 0 ], _strcmp );

	for( i = 0; i < words_n; ++i ) puts( words[ i ] );

    return  0;
}
3 Likes

요 두놈이 제일 큰 이유였네요… 님 짱bb

2 Likes

와…역시 이름에 방패있으신 분들은 엄청 똑똑하신 것 같아요.ㄷㄷ:+1:

1 Like

제 방패도 가져가세오, , , :kissing_heart:

3 Likes