Qsort는 배열에서 첫 번째 요소를 제거합니다 (char *).

에릭 레 우스

나는 C를 처음 접했고 char 포인터 배열과 함께 qsort ()를 사용하려고합니다. 예상대로 배열을 알파벳순으로 정렬하지 않고 첫 번째 요소를 제거합니다. 비교 기능을 포함한 모든 인수를 조정하려고 시도했지만 무엇이 잘못되었는지 파악할 수 없었습니다.

단어 입력 : foo
단어 입력 : bar
단어 입력 : baz
단어 입력 : quux

예상 :
bar
baz
foo
quux

결과:

Bar
Baz
Quux

내 코드 :

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

#define MAX_WORDS 10
#define MAX_LENGTH 20

int read_line(char str[], int n);
int compare(const void *a, const void *b);

int main(void) {
  char *words[MAX_WORDS], word[MAX_LENGTH + 1];
  int i;

  for(i = 0; i < MAX_WORDS; i++) {
    printf("Enter word: ");
    read_line(word, MAX_LENGTH);

    words[i] = malloc(strlen(word) + 1);
    if(!words[i]) {
      printf("Allocation of memory failed...\n");
      exit(EXIT_FAILURE);
    }

    strcpy(words[i], word);

    if(!strlen(words[i]))
      break;
  }

  qsort(words[0], i, sizeof(char *), compare);

  for(int j = 0; j <= i; j++) {
    printf("%s\n", words[j]);
  }

  return 0;
}

int read_line(char str[], int n) {
  int ch, i;

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

  return i;
}

int compare(const void *a, const void *b) {
  return strcmp((char *) a, (char *) b);
}
Ikegami

세 가지 오류.

  1. qsort 정렬되는 배열의 첫 번째 요소에 대한 포인터가 필요합니다.

    바꾸다

    qsort(words[0], i, sizeof(char *), compare);
    

    qsort(&( words[0] ), i, sizeof(char *), compare);
    

    아니면 그냥

    qsort(words, i, sizeof(char *), compare);
    

    이 후자의 버전은 포인터가 예상되는 곳에 사용 된 배열이 첫 번째 요소에 대한 포인터로 붕괴되기 때문에 작동합니다.

  2. 비교 함수는 정렬되는 배열의 요소에 대한 포인터를 전달합니다. 포인터 배열을 정렬하고 있기 때문에 비교 함수가 해당 포인터 ( char**)에 대한 포인터를 전달한다는 의미 입니다. 이와 같이 compare해야한다

    static int compare(const void *a, const void *b) {
      return strcmp(*(char **)a, *(char **)b);
    }
    

    더 나은 :

    static int compare(const void *a, const void *b) {
      return strcmp(*(char * const *)a, *(char * const *)b);
    }
    
  3. 최종 루프에 패스가 너무 많습니다.

    경우 i<MAX_WORDS(때문에 (빈 라인을 입력했기 때문에),이 방출되는 빈 줄의 원인이됩니다 words[i]길이가 0 인 문자열을 포함). 인 경우 정의되지 않은 동작을i==MAX_WORDS 호출합니다 ( 배열의 끝을 벗어 났기 때문 ).words[i]

    바꾸다

    for(int j = 0; j <= i; j++)
    

    for(int j = 0; j < i; j++)
    

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

언어 c char *는 첫 번째가 아닌 두 번째 요소에서 시작합니다.

분류에서Dev

Char * Array Objective C에서 첫 번째 요소 제거

분류에서Dev

PHP는 다중 배열의 첫 번째 키를 제거합니다.

분류에서Dev

Clojure는 ref 내에서 벡터의 첫 번째 (또는 마지막) 요소를 제거합니다.

분류에서Dev

첫 번째를 제외하고 비어있는 배열 요소

분류에서Dev

Vuex는 첫 번째 요소 만 제거합니다.

분류에서Dev

Typescript는 함수에서 첫 번째 인수를 제거합니다.

분류에서Dev

Lua는 경로에서 첫 번째 디렉토리를 제거합니다.

분류에서Dev

Bash는 for 루프에서 첫 번째 문자를 제거합니다.

분류에서Dev

shift () 메서드를 사용하지 않고 배열의 첫 번째 요소를 제거합니다.

분류에서Dev

Grails는 문자열의 첫 번째 문자를 제거합니다.

분류에서Dev

JS 감소는 배열의 첫 번째 요소를 잃습니다.

분류에서Dev

참조로 전달되는 배열 변수에서 첫 번째 요소를 가져옵니다.

분류에서Dev

한 배열의 첫 번째 요소를 두 번째 배열의 첫 번째 요소 등과 결합하는 방법

분류에서Dev

Bash는 문자열에서 첫 번째와 마지막 문자를 제거합니다.

분류에서Dev

Bash는 문자열에서 첫 번째와 마지막 문자를 제거합니다.

분류에서Dev

배열은 전체 요소 대신 첫 번째 요소 char을 반환합니다.

분류에서Dev

PHP는 배열의 첫 번째 요소 만 가져옵니다.

분류에서Dev

내부 for 루프는 각 루프에서 첫 번째와 다섯 번째 요소를 사용합니까?

분류에서Dev

개체 배열의 모든 요소를 반복 할 수 없습니다. ngFor 또는 구성 요소의 반복은 첫 번째 요소 만 제공합니다.

분류에서Dev

새 배열의 첫 번째 요소 = 첫 번째 요소를 제외한 모든 요소의 합계 인 배열이 필요합니다.

분류에서Dev

문자열을 포함하는 첫 번째 요소에서 다른 요소를 포함하는 마지막 요소까지 배열 조각을 얻

분류에서Dev

python2.7에서 목록에있는 각 행의 첫 번째 요소를 삭제합니다.

분류에서Dev

첫 번째 문자가 각 문자열에서 동일한 경우 배열의 각 문자열에서 첫 번째 문자를 제거합니다.

분류에서Dev

Scrapy는 첫 번째 요소와 게시물 제목에서 데이터를 수집합니다.

분류에서Dev

두 번째 배열의 첫 번째 배열에서 객체를 찾는 방법은 무엇입니까? Swift iOS

분류에서Dev

배열에서 값으로 첫 번째 요소 제외

분류에서Dev

3D 배열에서 첫 번째 배열의 첫 번째 배열에 요소를 추가하면 Numpy 배열의 크기가 변경됩니다.

분류에서Dev

두 번째 배열에 첫 번째 배열의 요소가 포함되어 있는지 확인한 다음

Related 관련 기사

  1. 1

    언어 c char *는 첫 번째가 아닌 두 번째 요소에서 시작합니다.

  2. 2

    Char * Array Objective C에서 첫 번째 요소 제거

  3. 3

    PHP는 다중 배열의 첫 번째 키를 제거합니다.

  4. 4

    Clojure는 ref 내에서 벡터의 첫 번째 (또는 마지막) 요소를 제거합니다.

  5. 5

    첫 번째를 제외하고 비어있는 배열 요소

  6. 6

    Vuex는 첫 번째 요소 만 제거합니다.

  7. 7

    Typescript는 함수에서 첫 번째 인수를 제거합니다.

  8. 8

    Lua는 경로에서 첫 번째 디렉토리를 제거합니다.

  9. 9

    Bash는 for 루프에서 첫 번째 문자를 제거합니다.

  10. 10

    shift () 메서드를 사용하지 않고 배열의 첫 번째 요소를 제거합니다.

  11. 11

    Grails는 문자열의 첫 번째 문자를 제거합니다.

  12. 12

    JS 감소는 배열의 첫 번째 요소를 잃습니다.

  13. 13

    참조로 전달되는 배열 변수에서 첫 번째 요소를 가져옵니다.

  14. 14

    한 배열의 첫 번째 요소를 두 번째 배열의 첫 번째 요소 등과 결합하는 방법

  15. 15

    Bash는 문자열에서 첫 번째와 마지막 문자를 제거합니다.

  16. 16

    Bash는 문자열에서 첫 번째와 마지막 문자를 제거합니다.

  17. 17

    배열은 전체 요소 대신 첫 번째 요소 char을 반환합니다.

  18. 18

    PHP는 배열의 첫 번째 요소 만 가져옵니다.

  19. 19

    내부 for 루프는 각 루프에서 첫 번째와 다섯 번째 요소를 사용합니까?

  20. 20

    개체 배열의 모든 요소를 반복 할 수 없습니다. ngFor 또는 구성 요소의 반복은 첫 번째 요소 만 제공합니다.

  21. 21

    새 배열의 첫 번째 요소 = 첫 번째 요소를 제외한 모든 요소의 합계 인 배열이 필요합니다.

  22. 22

    문자열을 포함하는 첫 번째 요소에서 다른 요소를 포함하는 마지막 요소까지 배열 조각을 얻

  23. 23

    python2.7에서 목록에있는 각 행의 첫 번째 요소를 삭제합니다.

  24. 24

    첫 번째 문자가 각 문자열에서 동일한 경우 배열의 각 문자열에서 첫 번째 문자를 제거합니다.

  25. 25

    Scrapy는 첫 번째 요소와 게시물 제목에서 데이터를 수집합니다.

  26. 26

    두 번째 배열의 첫 번째 배열에서 객체를 찾는 방법은 무엇입니까? Swift iOS

  27. 27

    배열에서 값으로 첫 번째 요소 제외

  28. 28

    3D 배열에서 첫 번째 배열의 첫 번째 배열에 요소를 추가하면 Numpy 배열의 크기가 변경됩니다.

  29. 29

    두 번째 배열에 첫 번째 배열의 요소가 포함되어 있는지 확인한 다음

뜨겁다태그

보관