2015-01-21 2 views
0

저는 C를 배우기 때문에이 특정 작업을 수행하고 싶습니다. 비슷한 질문과 답변이 많이 있다는 것을 알고 있지만, 여전히 ... 좀 더 자세하게하려고 노력할 것입니다.파일에서 행을 읽고 알파벳 순으로 정렬 된 배열을 만듭니다.

program01 
programs 
aprogram 
1program 
prog 
5program 

그리고 지금에 배열합니다 :

1program 
5program 
aprogram 
prog 
program01 
programs 

그래서 문자열의 라틴 소문자와 숫자, 공백이 있습니다를 나는 다음과 같은 라인을 가진 파일을 가지고 말할 수 있습니다. 나는 몇몇 별도의 단계를 수행하는 방법을 알고 있지만 전체적인 (그리고 적절한) 개념을 얻고 느끼기를 원한다. 파일에서 처음 읽을 때 즉시 정렬 결정을 내릴 수 있습니까? 필자의 특별한 경우에는 수동 정렬을 선호하는데, 이는 학습 향상과 가능한 최적화를 위해서입니다. 말하자면, 한 줄의 최대 길이는 256이고, 줄 수는 256입니다. 미리 감사드립니다.

+3

_i 몇 가지 별도의 steps_을 수행하는 방법을 알고, 확인 쇼 당신이 알고있는 당신에게 붙어있는 곳을, 다른 SO 사용자들도 그렇듯이 도와 드리겠습니다. –

+2

1) 읽기. 2) 정렬. 문제가 어디에 있습니까? –

+0

나는 비슷한 질문으로 시작해서 자신의 용도에 맞춰야한다고 생각한다. 결국 그들은 모두 기본적으로 같은 질문이지만 다른 문제를 안고있다. –

답변

1
The following cleanly compiles 
however, I have not tested it 

you might want to modify it to get the file name from 
the command line 

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

#define MAX_ROWS (256) 
#define MAX_COLUMNS (256) 
#define FILE_NAME "myInputFile" 

// prototypes 
void bubbleSortWordsArray(int wordCount); 
void printWordsArray(int wordCount); 

static char words[MAX_ROWS][MAX_COLUMNS] = {{'\0','\0'}}; 

int main(void) 
{ 
    FILE *fp = NULL; 

    if(NULL == (fp = fopen(FILE_NAME, "r"))) 
    { 
     perror("fopen failed"); 
     exit(EXIT_FAILURE); 
    } 

    // implied else, fopen successful 

    // read each line from file into entry in words array 
    int i = 0; 
    while(fgets(words[i], MAX_COLUMNS, fp)) 
    { 
     // remove trailing newline from string 
     words[i][strlen(words[i])-1] = '\0'; 
     i++; 
    } 

    // 'i' contains number of valid entries in words[][] 
    // sort the array of strings 
    bubbleSortWordsArray(i); 

    printWordsArray(i); 

    return(0); 
} // end function: main 


void bubbleSortWordsArray(int wordCount) 
{ 
    int c; // outer index through rows 
    int d; // inner index through rows 
    char swap[MAX_COLUMNS] = {'\0'}; 

    for (c = 0 ; c < (wordCount - 1); c++) 
    { 
     for (d = 0 ; d < (wordCount - c - 1); d++) 
     { 
      if( 0 > strcmp(words[d], words[d+1])) 
      { // then words need to be swapped 
       strcpy(swap, words[d] ); 
       strcpy(words[d], words[d+1]); 
       strcpy(words[d+1], swap); 
      } // end if compare/swap 
     } // end for 
    } // end for each row 
} // end function: bubbleSortWordsArray 


void printWordsArray(int wordCount) 
{ 
    int i; // loop index 

    printf("\n"); // start on new output line 
    for(i=0; i<wordCount; i++) 
    { 
     printf("%s\n", words[i]); 
    } 
} // end function: printWordsArray 
+0

사소한 생각 : 1) 최대 줄 수는 _length_ 256입니다. 2)''words [i] [strlen (words [i]) - 1]'은 라인이 시작될 때 희소 한 상황에서 문제가된다. 임베디드'\ 0 ''3)'''''''''''''''''''를 호출하는 것보다는 코드가 자신의 종류를 굴리는 것이 흥미 롭습니다. 4) '단어'초기화는 필요하지 않지만 나쁘지 않습니다. – chux

+0

@chux 예를 들어 buf 크기가 '5'이고 입력이 '1234'인 경우 'a [i] [strlen (a [i]) -1] ='\ 0 ''이 올바르게 수행되지 않아야합니다. 나는 내 코드에 동일한 체크를 가지고있다. – Gopi

-2

2D 문자 배열 은 fscanf 함수를 사용하여 읽으려고합니다. 구문을 기억하지 못해 죄송합니다. fscan은 전체 줄을 '\ n'까지 읽지 만 공백이 없어야합니다. 각 줄을 한 줄에 저장하십시오. 다음 종류의 그것은 각 문자열

+1

'fgets()'를 사용하는 것이 더 좋습니다. –

+0

fgets를 사용하면 '\ n'을 선택하고 이후의 문자열을 건너 뛸 수 있기 때문에 문제가 될 수 있습니다. 그래서 당신은 '\ n'을 플러시해야합니다. –

+0

그건 문제가되지 않습니다. "더 이상 문자열을 건너 뛸 수 있습니다"에 관해서는 버퍼를 깨뜨리는 것이 더 좋습니까? –

2

의 첫 번째 인덱스를 comparaing하여 아래의 코드를 확인하십시오

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

int main(void) { 
    char a[256][256]; 
    int i=0,j=0,k=0,n; 

    while(i<256 && fgets(a[i],256,stdin) != NULL) 
    { 
     n = strlen(a[i]); 
     if(n >0 && a[i][n-1] == '\n') 
     a[i][n -1] = '\0'; 
     i++; 
    } 

    for(j=0;j<i;j++) 
    { 
     char max[256]; 
     strcpy(max,a[j]); 
     for(k=j+1;k<i;k++) 
     { 
      if(strcmp(a[k],max) < 0) 
      { 
       char tmp[256]; 
       strcpy(tmp,a[k]); 
       strcpy(a[k],max); 
       strcpy(max,tmp); 
      } 
     } 
     strcpy(a[j],max); 
    } 

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

덧글 나는 여기에 적용한다. (http://stackoverflow.com/a/28072988/2410359) 줄이 'if (strlen (a [i]) <255)'에 맞지 않으면, IMO, 진행보다 불평하는 것이 좋습니다. 그렇지 않으면 분할 선이 2 위치로 정렬됩니다. 'i'가 255/6을 초과하지 않도록 제안하십시오. – chux

+0

참고 : ''\ n ''을 제거하려면 [여기] (http://stackoverflow.com/q/27491005/2410359) – chux

+0

@chux 입력 해 주셔서 감사합니다 – Gopi

관련 문제