2014-12-02 4 views
0

내 작업은 텍스트 파일에서 단어 palindromes를 찾아서 결과 파일에 인쇄하지 않는 것입니다. 결과 파일에는 팔린 드가 아닌 모든 공백과 단어 만 포함되어야합니다. 나는이 프로그램을 2 주 동안 계속해서 일해 왔지만, C에서 전체 newb 인 것처럼이 작업을 올바르게 수행하는 방법을 상상할 수는 없습니다. 또한 Linux 환경에서 작업해야하므로 strrev()와 같은 명령을 사용하여이 시점에서 내 인생을 훨씬 쉽게 만들어 줄 수는 없습니다 ...C에서 단어 palindrome

어쨌든 데이터 파일에는 많은 단어가 포함되어 있습니다. 꽤 많은 공간으로 구분 된 많은 줄.

여기는 작동하지만 어떤 공간에서도 작동하지 않는 프로그램입니다. 필요한 장소에서 프로그램을 검사하는 방법을 모르기 때문입니다.

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

const int CMAX = 1000; 
const int Dydis = 256; 
FILE *dataFile; 
FILE *resFile; 

void palindrome(char *linex); 

int main(){ 
    char duom[CMAX], res[CMAX], linex[Dydis]; 

    printf("What's the name of data file? \n"); 
    scanf("%s", duom); 
    dataFile=fopen(duom, "r"); 
    if (dataFile==NULL){ 
     printf ("Error opening data file \n"); 
     return 0; 
    }; 

    printf("What's the name of results file? \n"); 
    scanf ("%s", res); 
    resFile=fopen(res, "w"); 
    if (resFile==NULL){ 
     printf ("Error opening results file \n"); 
     return 0; 
    }; 

    while (fgets(linex, sizeof(linex), dataFile)) { 
     palindrome(linex); 
    } 
    printf ("all done!"); 
    fclose(dataFile); 
    fclose(resFile); 
} 

void palindrome(char *linex){ 
    int i, wordlenght, j; 
    j = 0; 
    char *wordie; 
    const char space[2] = " "; 
    wordie = strtok(linex, space); 
    while (wordie != NULL) { 
     wordlenght = strlen(wordie); 
     if (wordie[j] == wordie[wordlenght-1]) { 
      for (i = 0; i < strlen(wordie); i++) { 
       if (wordie[i] == wordie[wordlenght-1]) { 
        if (i == strlen(wordie)-1) { 
         fprintf(resFile,""); 
        } 
        wordlenght--; 
       } 
       else { 
        fprintf(resFile,"%s", wordie); 
        break; 
       } 
      } 
     } 
     else { 
      fprintf(resFile,"%s", wordie); 
     } 

     wordie = strtok(NULL, space); 
    } 
} 
+1

당신은 palindrome을 의미합니까? – Praxeolitic

+0

다각형이란 무엇입니까? – gnasher729

+0

나는 똑같은 방식으로 반응하려했다. 쓰지도 못하는 것에 어떻게 프로그램을 만들 수 있는가? p – yakoudbz

답변

0

편집 : 다음과 같은 작품 아래

코드 : 문자가 숫자하지 읽으면

  • 입력 파일이 문자
  • 으로 문자 읽어, 다음은 출력에 기록됩니다 파일
  • 다른 단어는 전체 단어가 fscanf
  • 이고 단어가 pali가 아닌 경우

    cancer kajak anna sam truck 
    test1 abc abdcgf groove void 
    xyz annabelle ponton belowoleb thing 
    cooc ringnir 
    

    출력 파일 :

    cancer sam truck 
    test1 abc abdcgf groove void 
    xyz annabelle ponton  thing 
    (line with two spaces) 
    

    으로 ndrome 후, 나는 다음과 같은 내용으로 파일을 생성 한


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

int is_pal(char* word) { 
    size_t len = strlen(word); 
    char* begin = word; 
    char* end = word + len - 1; 
    if (len == 1) { 
     return 1; 
    } 
    while (begin <= end) { 
     if (*begin != *end) { 
      return 0; 
     } 
     begin++; 
     end--; 
    } 
    return 1; 
} 

int main(void) 
{ 
    FILE* fin = fopen("pals.txt", "r"); 
    if (fin == NULL) { 
     perror("fopen"); 
     exit(1); 
    } 
    FILE* fout = fopen("out_pals.txt", "w"); 
    if (fout == NULL) { 
     perror("fopen"); 
     exit(1); 
    } 
    int ret; 
    char word[100]; 
    while ((ret = fgetc(fin)) != EOF) { 
     if (!isalpha(ret)) { 
      fprintf(fout, "%c", ret); 
     } 
     else { 
      ungetc(ret, fin); 
      fscanf(fin, "%s", word); 
      if (!is_pal(word)) { 
       fprintf(fout, "%s", word); 
      } 
     } 
    } 
    fclose(fin); 
    fclose(fout); 
    return 0; 
} 

출력 파일에 쓰기 당신은 볼 수 있습니다, 단어 사이의 공백의 수는 입력 파일과 동일합니다.

나는 한 단어가 최대 100 개의 문자를 가질 수 있다고 가정했습니다. 더 긴 단어가있을 경우, 고정 크기 버퍼에 fscanf으로 읽는 것이 해로울 수 있습니다.

+0

단어를 반복하는 것을 잊어 버렸습니다. 이것은 가장 바깥 쪽 문자 만 검사합니다. – Praxeolitic

+0

어 ... 무슨 실패 ... 고쳐 주셔서 고마워, 고정. – macfij

+0

아주 좋은 코드이지만 입력 파일의 공백은 어떻게됩니까? 왜냐하면 입력 파일에있는 것과 똑같은 위치에 출력 파일에 나타나야하기 때문입니다. 어쩌면 프로 시저에 "단어"를 부여하기 전후에 fgetc()를 점검해야 할 필요가 있을까요? – Pa2k3l1s

0

힌트 :

  • strtok() 당신에게로 구분 된 단어의 시작에 대한 포인터를 제공하지만이를 추출하거나 당신을 위해 자신의 캐릭터에 넣어하지 않습니다.

  • 각 단어의 끝을 찾으려면 약간의 논리가 필요합니다. 함수 strlen()은 char * 에서 얼마나 많은 문자가 있는지를 알려줍니다. 문장 내에 단어의 시작 에 대한 포인터를 지정하면 단어의 시작 부분부터 문장 끝까지의 길이를 제공합니다.

  • 라인의 단어와 하나의 단어가 도움이 될 수 회문 인지 여부를 반환하는 기능을 통해 루프 기능에 palindrome() 속보.

  • for 루프는 각 문자 쌍을 두 번 검사합니다. i은 단어 길이가 인 절반 이상만 스캔하면됩니다.

  • ifpalindrome() 안에 하나만 있으면됩니다. 왜 그렇게 많은지 모르겠습니다. 중복되어 있습니다.