c_cpp 从一个文件中搜索palindroms并将其按字母顺序放在另一个文件中

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c_cpp 从一个文件中搜索palindroms并将其按字母顺序放在另一个文件中相关的知识,希望对你有一定的参考价值。

#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 - 2; // -2 beacuse we get the newline char as well
    if (len == 1) {
        return 1;
    }
    while (begin <= end) {
        if (*begin != *end) {
            return 0;
        }
        begin++;
        end--;
    }
    return 1;
}

/*
typedef struct node {
    char* data;
    struct node *next;
    } node;
*/

static int cmp(const void *p1, const void *p2){
    return strcmp(* (char * const *) p1, * (char * const *) p2);
}

int main(void)
{
  char* in = "pals.txt";
  char* out = "out_pals.txt";

  FILE* finput = fopen(in, "r");
  if (finput == NULL) {
      perror("fopen");
      exit(1);
  }
  FILE* foutput = fopen(out, "w");
  if (foutput == NULL) {
      perror("fopen");
      exit(1);
  }
    
  unsigned long num_of_palindroms = 0;
  unsigned long line_len = 0;
  char* line = NULL;
  // first pass
  while ( getline(&line, &line_len, finput) != -1) {
    if (is_pal(line)) ++num_of_palindroms;
  }
  printf("number of palindroms in %s: %d\n", in, num_of_palindroms);

  // ----------------------------------------
  char** palindrom_arr = malloc(sizeof(char*) * num_of_palindroms);

  //second pass
  unsigned int ii = 0;
  rewind(finput);
  while ( getline(&line, &line_len, finput) != -1) {
    if (is_pal(line))
    {
      palindrom_arr[ii] = malloc(sizeof(char) * line_len);
      strcpy(palindrom_arr[ii], line);
      ++ii;
    }
  }

  qsort(palindrom_arr, num_of_palindroms, sizeof(char *), cmp);

  int i = 0;
  for (;i  < num_of_palindroms; ++i) {
    fprintf(foutput, "%s", palindrom_arr[i]);
    free(palindrom_arr[i]);
  }
  free(palindrom_arr);

  free(line);
  fclose(finput);
  fclose(foutput);
  return 0;
}

以上是关于c_cpp 从一个文件中搜索palindroms并将其按字母顺序放在另一个文件中的主要内容,如果未能解决你的问题,请参考以下文章

c_cpp is_palindrome.c

c_cpp 从文件中读取并做一些事情

HDU 1513 Palindrome:LCS(最长公共子序列)or 记忆化搜索

c_cpp 管道示例:从进程中读取字符并在另一个进程中以大写形式显示

B2. Palindrome Game (hard version)(记忆化搜索)

c_cpp 该程序从用户获取一个字符串,并查找该字符串中存在的元音,辅音,数字和空白的总数。