找到c中的回文,变量混乱

时间:2014-11-25 06:53:11

标签: c while-loop palindrome

我被分配做一个程序,它从输入文件palindrome中搜索,如果找到,则将其写入输出文件。我必须使用具有动态内存分配的两个缓冲区,并且应该在函数中完成与文本的安排。 Word是由空格分隔的符号数量。 在单词之间可能有更多的空格,应该忽略它们。

对我来说,这个程序的问题是程序不能正常工作,因为“x”值搞砸了(可能是“y”)。

while (i[(*x)] && i[(*x)]==' ')

正如我已经注意到这一行(^)改变了“x”值而不是它应该

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

#define MAX 255

int check_if_palindrome(char *i, int x, int y)
{
    if (x >= y)
        return 0;
    while (x < y)
        if (tolower(i[x++]) != tolower(i[--y]))
            return 0;
    return 1;
}
void searching_for_word(char *i, int *x, int *y)
{
    while (i[(*x)] && i[(*x)]==' ')
        (*x)++;
    (*y) = (*x);
    while (i[(*y)]!=' ')
        (*y)++;
}

int main()
{
    char *reading;
    char reading_file[MAX];
    char *writing;
    char writing_file[MAX];
    int x, y, i, j;
    FILE *read;
    FILE *write;
    puts("File name for input :");
    scanf("%s", reading_file);
    puts("File name for output :");
    scanf("%s", writing_file);
    read=fopen(reading_file, "r"); 
    if(read==NULL)
        perror("File does not exist");
    write=fopen(writing_file, "w");
    if(write==NULL)
        perror("File cannot be created");
    else{
        reading=malloc(MAX*sizeof(char));
        writing=malloc(MAX*sizeof(char));
        while(fgets(reading, MAX, read)!=NULL) 
        {
            x=0;
            do{
                searching_for_word(reading, &x, &y);
                if(check_if_palindrome(reading, x, y)==1){
                    j=0;
                    for(i=x; i<y; i++){
                    writing[j]=reading[i];
                    j++;
                    }
                    writing[j]='\n';
                    printf("%d\n", j);
                    for(i=0;i<=j;i++)
                    fputc(writing[i], write);
                }
                x=y;
            }
            while (reading[x]);
        }
    }
    fclose(read);
    fclose(write);
    return 0;
}

1 个答案:

答案 0 :(得分:2)

你的单词搜索功能基本上没问题,但有两点:你扫描超出缓冲区,因为空终止符不是空格。除了空格之外,你不会捕捉到空白字符,而这些字符不会捕捉fgets在行尾的新行字符。

解决方案是在'\0'推进y并使用isspace中的<ctype.h>时测试void searching_for_word(const char *i, int *x, int *y) { while (isspace(i[*x])) (*x)++; *y = *x; while (i[*y] && !isspace(i[*y])) (*y)++; }

i

(我已经const char *一个{{1}},因为你不会改变字符串。你也可以轻松地使用括号。你需要它们只是为了澄清你增加指向的值而不是指针本身。)