我被分配做一个程序,它从输入文件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;
}
答案 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}},因为你不会改变字符串。你也可以轻松地使用括号。你需要它们只是为了澄清你增加指向的值而不是指针本身。)