그래서 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;
}
로딩 코드 (질문에 포함되어야 함)가 크게 손상된 것 같습니다. 당신은 * realloc()의 반환 값을 * 사용해야한다 : 그것은 당신의 새로운'buffer'이다! – unwind
'char l = getchar();'은 경미한 재앙입니다. 'getchar()'는'char'가 아닌'int'를 반환합니다. 문자에 부호가 없으면 EOF 테스트가 적용되지 않습니다. 문자가 서명 된 경우 문자 코드 0xFF (종종 U + 00FF, ÿ, 라틴 소문자 Y (DIAERESIS 포함) 또는 y- 움라우트, 특히 터키어에서 사용)에서 가짜 EOF를 얻습니다. 'realloc()'의 반환 값을 새로운 변수에 저장하는 것이 좋습니다. ** bad **는 메모리 할당 실패를 검사하지 않으며, ** old ** 대신에 새로운 값을 사용하지 않는 ** bad **입니다. 'realloc()'을 사용하면 메모리를 이동할 수 있습니다. –
1) 줄이 무엇입니까? 2) feof() 사용법이 비현실적입니다. 3) malloc() et.al이 필요 없습니다. 4) realloc() int 포인터에 대한 char 포인터가 마술입니다! 5) succes는 무엇입니까? 6) sizeof (char)는 정의에 따라 1입니다. 7) 버퍼 란 무엇입니까? 8) 조나단이 숯과 EOF에 관해 말한 것. – wildplasser