2010-05-27 5 views
0
#include<stdlib.h> 
#include<stdio.h> 
#include<string.h> 

//This program is a sorting application that reads a sequence of numbers from a file and prints them on the screen . The reading from the file here , is a call back function . 

typedef int (*CompFunc)(const char* , const char*); 
typedef int (*ReadCheck)(char nullcheck); 
char array[100]; 

//Let this function be done in the library itself. It doesn't care as to where the compare function and how is it implemented. Meaning suppose the function wants to do sort in ascending order or in descending order then the changes have to be done by the client code in the "COMPARE" function who will be implementing the lib code. 

void ReadFile(FILE *fp,ReadCheck rc) 
{ 
    char a; 
    char d[100]; 
    int count = 0,count1=0; 
    a=fgetc(fp); 
    //printf("%c",a); 
    //count1=(*rc)(a); 
    //printf("%d",count1); 
    while (1 !=(*rc)(a)) 
    { if(a==' ') 
     { 

     d[count1]='\0'; 
     strcpy(&array[count],d); 
     count=count+1; 
     printf("%s \n",d); 
     memset(d,'\0',100); 
     count1=0; 
     } 
     else 
     { 

     d[count1]=a; 
     count1=count1+1; 
     //a=fgetc(fp); 

     } 
     //printf("%c",a); 
     a=fgetc(fp); 
    } 

} 
void Bubblesort(char* array , int size , int elem_size , CompFunc cf) 
{ int i,j,k; 
    int *temp; 
    for(i=0;i < size ;i++) 
    { 
     for (j=0;j < size -1 ; j++) 
     { 
      // make the callback to the comparision function 
      if(1 == (*cf)(array+j*elem_size,array+ (j+1)*elem_size)) 
       { 
        //interchanging of elements 
        temp = malloc(sizeof(int *) * elem_size); 
        memcpy(temp , array+j*elem_size,elem_size); 
        memcpy(array+j*elem_size,array+(j+1)*elem_size,elem_size); 
        memcpy(array + (j+1)*elem_size , temp , elem_size); 
        free(temp); 
       } 
     } 
    } 

for (k=0;k<5;k++) 
    printf("%s \n",array[k]); 
} 



//Let these functions be done at the client side 

int Compare(const char* el1 , const char* el2) 
    { 
     int element1 = *(int*)el1; 
     int element2 = *(int*)el2; 

     if(element1 < element2) 
      return -1; 
     if(element1 > element2) 
      return 1 ; 
     return 0; 
    } 

int ReadChecked(char nullcheck) 
    { 
     if (nullcheck=='\n') 
      return 1; 
     else 
      return 0; 
    } 
int main() 
{ 
    FILE *fp1; 
    int k; 
    fp1=fopen("readdata.txt","r"); 
    ReadFile(fp1,&ReadChecked); 
    for (k=0;k<5;k++) 
    printf("%s \n",array[k]); 
    Bubblesort((char*)array,5,sizeof(array[0]),&Compare); 
    printf("after sorting \n"); 
    for (k=0;k<5;k++) 
    printf("%s \n",array[k]); 

return 0; 
} 

배열 데이터 세그먼트 오류 상태

123 
    11 
    2312 
    121 
    231 

을 가지고 있으며 정확히 동일한 방식으로 데이터를 출력한다. 결국 그것의 인쇄는 세분화 오류를줍니다.

+0

배열 유형은 무엇입니까? –

+0

더 많은 코드가 필요합니다. – Stephen

+0

나는 지금 전체 코드를 주었다 .. – Hick

답변

2

배열 유형은 무엇입니까? 당신이 잘못 사용하고있는 것처럼 들립니다.

당신은 int 배열이있는 경우 :

printf("%i \n",array[k]); 

참고 %의 i와 % d의 출력에 대한 동의어입니다. 당신은 문자열의 배열이있는 경우

는 :

%s는 유형 char*의 문자열입니다. 즉, %s을 사용하려면 배열의 각 요소에 각각 char* 유형의 null 종료 문자열이 있어야합니다. 문자열이 종료가 0 인 문자 배열인지 확인하십시오.

+0

@natheres : % i과 % d는 출력을위한 동의어입니다. –

+0

우리가 대답 할 때 질문은 계속 변경됩니다. 나는 그가 배열에 잘못 접근하고 있다고 지적했다. 그리고 그는 그의 질문에서 그것을 바로 잡았다. 그런 다음 int 배열로 보이지 않는 문자열 배열이됩니다. 제발 downvotes 개최,이 질문은 자신의 인생을 가지고있다 : –

+0

@ 팀 : 사람들은 당신이 int를 인쇄하기 위해 % i를 사용할 수 없다고 생각했기 때문에 나는 downvotes (3)을 얻고 있었다고 생각한다. 그러나 남자 3 printf 문서는 출력이 걱정되는 한 동일하다고 말합니다. –

5

array 유형은 무엇입니까? int의 배열 인 경우 이 아닌 %d의 형식으로 인쇄해야합니다.

printf("%d\n", array[k]); 

arrayint의 배열 인 경우 : 당신이 %s를 사용하는 경우

printf 함수는 문자열 (char*)로 array[k]을 취급은, 값 인쇄 그러므로합니다 역 참조 거기의 인물들. 그러나 123 (0x7b)은 잘못된 주소이므로 시스템이 SEGFAULT로 실행 파일을 종료합니다.

컴파일하는 동안 모든 경고를 사용하도록 설정하십시오. 컴파일러는 유형 오류를보고 경고 할 수 있습니다.


편집 : 그러나 arraychar의 배열입니다 .... 그것은 단지 논리적이 아닌 5. 당신은 당신은 더 나은 구조를 수정할 것

printf("%s \n", array); // cannot index. 

를 사용하여 인쇄하려면 1 문자열을 저장할 수 귀하의 코드입니다.

+0

그것은 문자열의 아리안입니다. – Hick

+0

15 분 전에 물어 본 질문에서 int의 배열 –

+0

@meka : 모든 코드를 게시하십시오. 문자열 배열 인 경우 오류가 다른 곳에서 발생합니다. – kennytm

0

세그멘테이션 오류가 발생하는 것은 printf 루프가 확실합니까? 만약 당신이 말한대로 모든 숫자가 인쇄 되었다면 그것은 세그멘테이션 결함의 원인이 된 후에도 가능할 것입니다.

printf를 추가하십시오 ("여기에 만들었습니다. \ n"); 루프가 끝나면 줄이 확실해진다.

0
printf("%s \n",array[k]); 

배열 [K]는 문자가 아닌 문자 포인터이므로 %의 C 아닌 % s에 인쇄 할 필요가있다. 그렇지 않으면 인쇄 할 문자열을 쓸데없는 검색으로 메모리의 처음 256 바이트에있는 주소의 참조를 취소하려고합니다.