在c中查找回文,变量(s)会出错

在c中查找回文,变量(s)会出错,c,while-loop,palindrome,C,While Loop,Palindrome,我被分配去做一个程序,它从输入文件回文中搜索,如果找到了,它将被写入输出文件。我必须使用动态内存分配的两个缓冲区,并且文本的安排应该在函数中完成。单词是由空格分隔的符号数量。 单词之间可能有更多的空格,应该忽略它们 对我来说,这个程序的问题是,当“x”值被弄乱(可能还有“y”)时,程序不能工作 正如我所注意到的,这一行(^)改变了“x”值,而不是它应该改变的 #include<stdlib.h> #include<stdio.h> #include<string.h

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

对我来说,这个程序的问题是,当“x”值被弄乱(可能还有“y”)时,程序不能工作

正如我所注意到的,这一行(^)改变了“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;
}
#包括
#包括
#包括
#包括
#定义最大值255
int check_if_回文(char*i,int x,int y)
{
如果(x>=y)
返回0;
while(x对于(i=x;i而言,您的单词搜索功能基本上是正常的,但有两点:您可以扫描缓冲区以外的区域,因为空终止符不是空格。您不能捕获空格以外的空格字符,这将不会捕获
fgets
在行尾留下的新行字符

解决方案是在前进
y
时测试
'\0'
,并从
使用
isspace


(我制作了
I
a
const char*
,因为你不需要更改字符串。你也可以轻松使用括号。你只需要它们来说明你增加了指向的值,而不是指针本身。)

while(I[(*x)]&&I[(*x)]=''
可以替换为
while(I[(*x)]='')
@CoolGuy它仍然做同样的事情。测试应该在第二个
while
while(i[(*y)]&&i[(*y)]!=''(*y)+;
。这样,当没有更多的单词时(除了
i[x]='\0'
),你就有了
y==x
。一些小点:您确实不需要
写入
缓冲区;您可以从输入字符串中进行输出,因为它永远不会被您的单词查找和回文函数修改。您还可以在堆栈上创建
读取
,就像您对文件名所做的那样。(但是如果
malloc
,您还必须
释放
)在
main
中,您的
else
只捕获输出文件无法打开的情况。当您无法打开输入文件时,主循环仍将执行。最好在'perror'之后调用
exit(1)
。感谢您给出并向我解释这些解决方案。
#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;
}
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)++;
}