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