C中的单词回文

时间:2014-12-02 17:10:53

标签: c text spaces words

我的任务是在文本文件中找到单词回文并且不将它们打印到结果文件中。结果文件应该只包含非回文的所有空格和单词。我已经在这个项目上工作了两个星期,但由于我是C中的新手,我不能简单地想象如何正确地做到这一点。另外,我必须在Linux环境中工作,所以我不能使用像strrev()这样的命令,这会使我的生活变得更容易......

无论如何,数据文件包含许多以很多空格分隔的行中的很多单词。

这是正在运行的程序,但不适用于任何空格,因为我不知道如何在所需位置检查它们。

#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);
    }
}

2 个答案:

答案 0 :(得分:0)

编辑:

以下代码的工作原理如下:

  • 输入文件由char
  • 读取
  • 如果char read不是字母数字,则将其写入输出文件
  • 否则,整个单词都以fscanf
  • 阅读
  • 如果单词不是回文,则写入输出文件


#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)

如您所见,单词之间的空格数与输入文件中的空格数相同。

我假设单个单词最多可以有100个字符。如果单词较长,则使用fscanf读取固定大小的缓冲区可能会有害。

答案 1 :(得分:0)

提示:

  • strtok()为您提供指向分隔词开头的指针,但它没有 提取它们或将它们放在自己的字符串中。

  • 你需要一些逻辑来找到每个单词的结尾。功能 strlen()将告诉你char中有多少个字符* 直到一个空字符。如果你给它一个指向开始的指针 在一个句子中的一个单词,它将给你从开始的长度 一句话到句子的结尾。

  • palindrome()分解为一个循环遍历一行中的单词的函数 返回单个单词是否为回文的函数 可能有帮助。

  • 你的for循环正在检查每对字母两次。 i只需扫描一半以上 字长。

  • if内只需一个palindrome()。我不确定你为什么这么多。 他们是多余的。