2013-12-03 1 views
-3

나는 텍스트 파일을 입력으로 사용하여 단어의 색인을 만들고 출력 (색인)을 파일과 화면에 인쇄하는 프로그램을 작성하고 있습니다. 나는 아래와 같이 코딩했고 은 문제를 발견하거나 적어도 좁히려 고 노력했다. 그러나 나는 그럴 수 없었다. 누구나 구문 또는 코드 논리에 문제가 있거나 도움이 될 수 있다면 기꺼이 알게 될 것입니다.왜 "인덱스 생성"프로그램이 작동하지 않습니까?

void main(int argc, char * argv[]) 
{ 
    //clearscreen 
    clrscr(); 

//if arguments are less that default of the program 
if (argc < 2) 
{ 
    cout << "You should've input 3 arguments." ; 
    return; 
} 

//opening the input file and defining a pointer which points to it as argv[1] 
FILE *fPtr = fopen(argv[1], "r+"); 

//defining a 2D array to hold maximum to 200 words holding maximum to 20 characters 
char words[200][20]; 

//initializing words 2D array with zero ASCII 
for(int i = 0; i < 200; i++) 
    for(int j = 0; j < 20; j++) 
     words[i][j] = 255; 

//defining an 2D whi array which is supposed to show how many times words are placed in which lines in a defined layout 
//it holds maximum to 200 words holding maximum 100 sentences 
int index[200][100]; 

//initializing the index 2D array with zero ASCII 
for(i = 0; i < 200; i++) 
    for(j = 0; j < 100; j++) 
     index[i][j] = 0; 

//this array of characters max to 2000 is supposed to hold each line which is gotten with fgets 
char buff[2000]; 

//initializing the buff array with zero ASCII 
for(i = 0; i < 2000; i++) 
    buff[i] = 0; 

//the max of the words used in the source file is 200. but this valuable named as 'last' says how many words are used in this source file 
//its initalized as no words is held 
int last = 0; 

//defining a pointer to char of punctuation mark characters. all ASCII codes expect for a - z, A - Z, 0 - 9 and newline 
char *punc; 

//initializing punctuation marks array 
for(i = 0; i < 256; i++) 
{ 
    if(i == 10) 
     continue; 
    if(i >= '0' && i <= '9') 
     continue; 
    if(i >= 'a' && i <= 'z') 
     continue; 
    if(i >= 'A' && i <= 'Z') 
     continue; 
    char *string = (char *) &i; 
    strncat(punc, string, 1); 
} 

//how many lines is read from the source file 
int lineread = 0; 

//a word which the processes are done on that 
char *word; 

//one line read 
while(fgets(buff, 1999, fPtr) != NULL) 
{ 
    //how many words is read from the source file in the current line 
    int wordread = 0; 

    word = strtok(buff, punc); 

    //one word read 
    while(word != NULL) 
    { 
     //sorting 
     int k = 0; 
     while(strcmp(word, words[k])> 0) 
      k++; 
     if(strcmp(word, words[k])) 
     { 

      for(int l = last; l >= 0; l--) 
      { 
       strcpy(words[l + 1],words[l]); 
       for(int o = 0; o <= lineread; o++) 
        index[l + 1][o] = index[l][o]; 
      } 
      last++; 
      strcpy(words[k],word); 
      for(l = 0; l <= lineread; l++) 
       index[k][l] = 0; 
     } 
     index[k][lineread]++; 
     wordread++;//go to next word 
     word = strtok(NULL, punc); 
    } 
    lineread++;//go to next line 
} 
//closing the input file 
fclose(fPtr); 

//opening the output file and defining a pointer which points to it as argv[2] 
FILE *fPtr2 = fopen(argv[2], "w+"); 

//showing the index in cmd 
for(i = 0; i <= last; i++) 
{ 
    printf("%-20s" , words[i]); 
    fprinf(fPtr2, "%-20s" , words[i]); 
    int m = 0; 
    for(j = 0; j <= lineread; j++) 
    { 
     if(m) 
     { 
      printf("%c", ','); 
      fprintf(fPtr2, "%c", ','); 
     } 
     if(index[i][j]) 
     { 
      printf("%i", j + 1); 
      fprintf(fPtr2, "%i" ,j + 1); 
     } 
     if(index[i][j] > 1) 
     {  
      printf("(%i)", index[i][j]); 
      fprintf(fPtr2, "(%i)", index[i][j]); 
       m = 1; 
     } 
    } 
    printf("\n"); 
    fprintf(fPtr2, "\n"); 
} 

//closing the output file 
fclose(fPtr); 
} 

이제 비정상 프로그램 종료 NULL 포인터 할당으로 오류가 발생합니다. 터보 C를 사용해야하고 DOS SHELL을 사용합니다. resourse에 "input.txt"라는 파일 이름이 있습니다. input.txt를이 경우

programname.exe input.txt output.txt 

내 원하는 출력 :와 DOS SHELL에서 나는이 쓰기

hello. hello. 
how are 
you? hello. 

desired output: 

hello     1(2),3   //2 times in line 2, 1 time in line 1 
how      2    //1 time in line 2 
are      2    //1 time in line 2 
you      3    //1 time in line 3 
+0

을 있지만 다음 루프, 그것을로 향했다 초기화되지 사용됩니다 ... 일부 메모리를 가리 키도록 초기화하지 않아야합니까? –

+0

해당 부품이 올바르게 작동하지 않습니다. 나는 전에이 부분을 테스트했다. –

+0

또한'words','index','buff'는 모두 "ASCII ASCII로 초기화"되어 있습니다. 처음에는 모두 255로 설정되고 나머지는 모두 0으로 설정됩니다. 세 가지 모두에게 똑같은 것이다. –

답변

0

문제는이 라인이다 :

while(strcmp(word, words[k])> 0) 

때문에 index입니다 255으로 초기화되고 알고리즘에 따라 strcmp이 작동합니다. 첫 번째 단어의 경우 코드가 올바르게 작동하고 word[0]에 넣지 만 이 properly.for 일례를 작동하지 E 번째 단어 : strcmp

first word: Kittens 
second word: Biscuits 

첫번째 Kittens255 ASCII code와 비교한다. 그 결과는 Kitten이 작고 프로세스는 word[0]에 넣을 것입니다. 그러나 두 번째 단어의 경우 strcmpBiscuitsKittens과 비교하면 Kittens이 더 크고 프로그램은 word[]의 다른 블록을 거치지 않을 것으로 예상됩니다. 이 프로그램은 0-word[]를 초기화하는 대신 먼저 언급되는 그이 코드를 사용하여 수정 될 것입니다 : 당신은 숯불 *의 punc``정의를 참조

while(strcmp(word, words[k])> 0)