2012-02-11 5 views
2

그래서 stdio에서 함수를 읽어 들이고 n 청취 한 문자를 계속 읽는 프로그램에서 일하고 있습니다. 자입니다.qsort 세분화 오류

지금까지 모든 것을 버퍼라는 문자 배열에 저장했습니다. 다음 단계에서는 n 개의 문자로 된 각 덩어리를 정렬해야합니다. 예를 들어, cats/ndogs/n 문자열은 cats/n dogs/n으로 분할해야하며 n = 5이면 qsort()은 알파벳순으로 정렬해야합니다. 내가 qsort() 전화 해요 방법이다 : (line-2)*n*sizeof(char) 배열 버퍼에있는 항목의 총 수를 제공

qsort (buffer, (line-2)*n*(sizeof(char)),n,compare); 

을; 이 경우 10입니다.

이 내 비교 함수 :

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

내가 이것을 실행하면,하지만, 난 항상 strcmp()의 독방 감금 오류를 얻을. 어떤 아이디어?


이 로딩 코드 :

while (!feof(stdin)) 
{ 
    for (i = 0; i < n; i++) 
    { 
     char l = getchar(); 
     if (l != EOF) 
     { 
      if ((i == 0) && (line != 1)) 
      { 
       success = (int *)realloc(buffer, line*n*(sizeof(char))); 
      } 
      buffer[(n*(line-1))+i] = l; 
     } 
    } 
    line = line + 1; 
} 
+0

로딩 코드 (질문에 포함되어야 함)가 크게 손상된 것 같습니다. 당신은 * realloc()의 반환 값을 * 사용해야한다 : 그것은 당신의 새로운'buffer'이다! – unwind

+0

'char l = getchar();'은 경미한 재앙입니다. 'getchar()'는'char'가 아닌'int'를 반환합니다. 문자에 부호가 없으면 EOF 테스트가 적용되지 않습니다. 문자가 서명 된 경우 문자 코드 0xFF (종종 U + 00FF, ÿ, 라틴 소문자 Y (DIAERESIS 포함) 또는 y- 움라우트, 특히 터키어에서 사용)에서 가짜 EOF를 얻습니다. 'realloc()'의 반환 값을 새로운 변수에 저장하는 것이 좋습니다. ** bad **는 메모리 할당 실패를 검사하지 않으며, ** old ** 대신에 새로운 값을 사용하지 않는 ** bad **입니다. 'realloc()'을 사용하면 메모리를 이동할 수 있습니다. –

+1

1) 줄이 무엇입니까? 2) feof() 사용법이 비현실적입니다. 3) malloc() et.al이 필요 없습니다. 4) realloc() int 포인터에 대한 char 포인터가 마술입니다! 5) succes는 무엇입니까? 6) sizeof (char)는 정의에 따라 1입니다. 7) 버퍼 란 무엇입니까? 8) 조나단이 숯과 EOF에 관해 말한 것. – wildplasser

답변

1

어리석은 질문, 그러나 당신의 문자열이 종료 null이? 마지막에 개행 만있는 것 같습니다.

또한, "strcmp ((char *) a, (char *) b)"가 여분의 것으로 보이기 때문에 필요할 수도 있습니다.

+0

그들은 terminnt 널 arent, 나는 strcmp 일이있는 각 n 특성의 끝에 null 종결자를 추가 할 필요가있을 는가 것입니다? 그래서이 예제에서 나는 12 자의 버퍼를 만들어야 만한다. – user1161080

+0

왜 strcmp 함수를 복잡하게 만들지 모르겠다 ??그것은 단지 strcmp ((char *) a, (char *) b) – noMAD

+0

글쎄, strcmp는 두 문자열에서 첫 번째 null을 찾을 것이기 때문에 널 문자로 끝낼 수 있습니다 ("ABCDE"의 경우 6 문자를 필요로합니다). (따라서 메모리 오류가없는 경우) 또는 strncmp를 사용할 수도 있지만 문자열의 최대 길이를 지정하는 전역 변수가 필요합니다 –

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

char buffer[] ="333000222555111777888666999444"; 

int mycmp(void *l, void*r); 
int main(void) 
{ 
/* note: sizeof buffer is 31, 
** but the integer division will round down 
** , ignoring the extra nul-byte */ 
qsort(buffer, (sizeof buffer/3), 3, mycmp); 
printf ("[%s]\n", buffer); 

return 0; 
} 

int mycmp(void *l, void *r) 
{ 
return memcmp(l,r,3); 
} 
+0

memcmp에 의해 세 번째 매개 변수로 크기를 사용하여 변경되었으며 더 이상 세그먼트 오류가 발생하지 않습니다. . 그러나 함수가 아무것도하지 않는 동일한 시간에 배열 배열의 내용은 정렬되지 않습니다 .. – user1161080

+0

내가 게시 한 코드는 데모 용으로 만 사용되었습니다. 코드가 불완전하지만 오류가 두 개 이상 있습니다. 읽기 부분과 정렬 부분을 분리하여 개별적으로 빌드하고 디버그하십시오. – wildplasser