【发布时间】:2017-04-15 02:37:44
【问题描述】:
我正在尝试制作一个程序,该程序可以逐行扫描包含单词的文件,并在您向后阅读时删除拼写相同的单词(回文)
这是program.c文件:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "header.h"
int main(int argc, char **argv)
{
if(argc != 3)
{
printf("Wrong parameters");
return 0;
}
FILE *data;
FILE *result;
char *StringFromFile = (char*)malloc(255);
char *word = (char*)malloc(255);
const char *dat = argv[1];
const char *res = argv[2];
data = fopen(dat, "r");
result =fopen(res, "w");
while(fgets(StringFromFile, 255, data))
{
function1(StringFromFile, word);
fputs(StringFromFile, result);
}
free(StringFromFile);
free (word);
fclose(data);
fclose(result);
return 0;
}
这是 header.h 文件:
#ifndef HEADER_H_INCLUDEC
#define HEADER_H_INCLUDED
void function1(char *StringFromFile, char *word);
void moving(char *StringFromFile, int *index, int StringLength, int WordLength);
#endif
这是函数文件:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "header.h"
void function1(char *StringFromFile, char *word)
{
int StringLength = strlen(StringFromFile);
int WordLength;
int i;
int p;
int k;
int t;
int m;
int match;
for(i = 0; i < StringLength; i++)
{ k=0;
t=0;
m=i;
if (StringFromFile[i] != ' ')
{ while (StringFromFile[i] != ' ')
{
word[k]=StringFromFile[i];
k=k+1;
i=i+1;
}
//printf("%s\n", word);
WordLength = strlen(word)-1;
p = WordLength-1;
match=0;
while (t <= p)
{
if (word[t] == word[p])
{
match=match+1;
}
t=t+1;
p=p-1;
}
if ((match*2) >= (WordLength))
{
moving(StringFromFile, &m, StringLength, WordLength);
}
}
}
}
void moving(char *StringFromFile, int *index, int StringLength, int WordLength)
{ int i;
int q=WordLength-1;
for(i = *index; i < StringLength; i++)
{
StringFromFile[i-1] = StringFromFile[i+q];
}
*(index) = *(index)-1;
}
但它不能正确读取每个单词。
这是数据文件:
abcba rttt plllp
aaaaaaaaaaaa
ababa
abbbba
kede
这些是程序读取的单独单词:
abcba
rttta
plllp
aaaaaaaaaaaa
ababa
abbbba
kede
这是结果文件:
abcba rtttp
kede
如果一行中只有一个单词,它可以正常工作,但是当有多个单词时它会混乱。任何帮助表示赞赏。
【问题讨论】:
-
abcba 是回文
-
@Fefux 这就是问题所在:包含
abcba的行上有三个单词。 -
我不确定您是否将第一行视为三个单词,如果它们都是回文,则每个单词都需要删除,但您的程序似乎正在阅读整行并看到这条线完全不是回文。但是,我不确定它为什么会这样打印。
-
使用
strtok标记每行中的单词。您可以使用space、tab和任何其他单词分隔符将行拆分为带有strtok的单词。然后只需对每个单词进行操作即可。至于检查,您可以按原样进行,也可以在每个单词中设置一个指向开始和结束字符的指针,然后使用while (s < e && *s == *e) s++, e--;进行检查(其中s和e是开始和结束指针)