2014-12-02 3 views
0

Моя задача - найти слова palindromes в текстовом файле и НЕ распечатывать их в файл результатов. Файл результатов должен содержать только все пробелы и слова, которые не являются палиндромами. Я работаю над этой программой в течение двух твердых недель, но поскольку я полный новичок в C, я не могу просто представить, как это сделать правильно. Кроме того, я должен работать в среде Linux, поэтому я не могу использовать команды, такие как strrev(), что сделало бы мою жизнь намного легче на данный момент ...Слово палиндром в C

Anyways, файл данных содержит много слов в много линий, разделенных довольно многими пробелами.

Это программа, которая работает, но не работает с любыми пространствами, потому что я не знаю, как их проверить в нужном месте.

#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

Вы имеете в виду палиндром, не так ли? – Praxeolitic

+0

Что такое полидром? – gnasher729

+0

Я как раз собирался реагировать так же ... как можно сделать программу на вещь, которую вы даже не можете написать: p – yakoudbz

ответ

0

EDIT:

Код ниже работ следующим образом:

  • входного файла считывается символ на гольца
  • если символ чтения не алфавитно-цифровой, то оно записывается в выходной файл
  • еще, все слово считывается fscanf
  • если слово не является пали 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; 
} 

я создал файл с следующим содержанием:

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) 

As вы можете видеть, что количество пробелов между словами есть так же, как и во входном файле.

Я предположил, что одно слово может иметь максимум 100 символов. Если бы были более длинные слова, чтение с fscanf на буфер фиксированного размера может быть вредным.

+0

Вы забыли перепрыгнуть через слово. Это проверяет только внешние символы. – Praxeolitic

+0

Гоша ... какой провал :) спасибо, что заметили это, исправлено. – macfij

+0

Это очень хороший код, но как насчет пробелов во входном файле? Потому что они также должны появляться в одном и том же месте в выходном файле, так как они находятся во входном файле. Может быть, мне нужно проверить с помощью fgetc() до и после предоставления «слова» процедуре? – Pa2k3l1s

0

Подсказка:

  • strtok() дает указатель на начало разделителей слов, но это не извлечь их или поместить их в их собственной строке для вас.

  • Вам нужна логика, чтобы найти конец каждого слова. Функция strlen() расскажет вам, сколько символов есть у char * , которое доходит до нулевого символа. Если вы дадите ему указатель на начало слова в предложении, он даст вам длину от начала слова до конца предложения.

  • Ломать palindrome() в функцию, которая перебирает слова в строке и функцию, которая возвращает ли не одно слово палиндром может помочь.

  • Ваш цикл for проверяет каждую пару букв дважды. i нужно только сканировать более половины слова длиной.

  • Вам нужен только один if в пределах palindrome(). Я не уверен, почему у вас так много. Они избыточны.

Смежные вопросы