我的任务是创建程序,从文件中读取所有单词,并将从头到尾相同的单词放入输出文件中(我的意思是aha,oho,asdsa,assa等)。任务需要使用动态内存(大学),但我被困在这个地方好几天了,因为我找不到为什么它不想做我打算做的事情。我有 4 个单词在文件中。这 4 个 printfs 应该打印所有单词,但我的程序打印第 3 个单词 (null) 和分割错误。我使用单面动态内存。请解释为什么它不起作用,因为我自己做不到。提前谢谢你!法典:
/*
* Task: Write program, that finds all words from file which reads from beginning to end (lets call them mirror-type words)
*/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
struct elements
{
char str[255];
struct elements *next;
};
/* Function checks if given word is mirror-type word */
int is_mirror(char str[255])
{
int length = strlen(str);
int to = (length % 2 == 1) ? (length - 1) / 2 : length / 2;
int i = 0;
while (i < to)
{
if (str[i] != str[length-i-1]) return 0;
i++;
}
return 1;
};
int main()
{
FILE *in;
in = fopen("3_12.in", "r");
if (in == NULL)
{
printf("Input file doesnt exist.rn");
return 0;
}
char str[255];
fscanf(in, "%s", str);
struct elements *beginning, *element;
element = (struct elements *) malloc(sizeof(struct elements));
strcpy(element->str, str);
beginning = element;
do
{
fscanf(in, "%s", str);
element->next = (struct elements *) malloc(sizeof(struct elements));
strcpy(element->str, str);
if (feof(in))
{
element->next = NULL;
break;
}
}
while(1);
printf("%srn", element->str);
printf("%srn", element->next->str);
printf("%srn", element->next->next->str);
printf("%srn", element->next->next->next->str);
fclose(in);
}
查看您的代码,您似乎错过了循环中的一步。您永远不会前进传递第二个单词,因为元素永远不会更新。
代码片段
do
{
fscanf(in, "%s", str); //Get the string
element->next = (struct elements *) malloc(sizeof(struct elements)); //Create a new element at the end of the list
element = element->next; //Move forward to the newly created element
strcpy(element->str, str); //Copy the read string into the newly create element's `str`
//If we've hit the end of the file, put a null at the end of the list and break
if (feof(in))
{
element->next = NULL;
break;
}
}
while(1);
查看此页面,它有一些关于链接的lsits的精彩信息(这就是您正在使用的)。
编辑 1
我注意到我编写的原始代码存在错误。在设置str
的地方,它覆盖了原始元素的str
值。该代码永远不会创建超过 1 个元素的列表,并且该元素将始终具有文件中的最后一个单词,后跟 null。
这是两个单词应该如何阅读。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
struct elements {
char str[255];
struct elements *next;
};
int main() {
FILE *in;
in = fopen("test.txt", "r");
if (in == NULL) {
printf("Input file doesnt exist.rn");
return 0;
}
char str[255];
fscanf(in, "%s", str);
struct elements *beginning, *element;
element = malloc(sizeof(struct elements));
strcpy(element->str, str);
element->next = NULL;
beginning = element;
do {
fscanf(in, "%s", str);
element = malloc(sizeof(struct elements));
strcpy(element->str, str);
element->next = NULL;
beginning->next = element;
if (feof(in)) {
break;
}
} while (1);
printf("%srn", beginning->str);
printf("%srn", beginning->next->str);
fclose(in);
free(beginning->next);
free(beginning);
}
测试.txt
aabb
sam
因此,您正在尝试构建一个链表。我在上面的示例中创建了一个节点,将读取的第一个单词设置为 element->str
,并将element->next
设置为 NULL。
然后,我将beginning
设置为该节点。请注意,人们通常使用 head 而不是 beginning
,因为它是列表的第一个节点。
然后我对下一个单词做同样的事情,我将新节点作为列表的第二个节点插入。
你看到你需要建立一个列表,因为这变得越来越大。我通过这段代码学会了如何做到这一点。
不要强制转换 malloc() 返回的内容。
更改
beginning = element;
do
{
fscanf(in, "%s", str);
element->next = (struct elements *) malloc(sizeof(struct elements));
strcpy(element->str, str);
if (feof(in))
{
element->next = NULL;
break;
}
}
while(1);
printf("%srn", element->str);
printf("%srn", element->next->str);
printf("%srn", element->next->next->str);
printf("%srn", element->next->next->next->str);
自
beginning = element;
while(EOF!=fscanf(in, "%s", str)){
element->next = (struct elements *) malloc(sizeof(struct elements));
element = element->next;
strcpy(element->str, str);
}
element->next = NULL;
printf("%sn", beginning->str);
printf("%sn", beginning->next->str);
printf("%sn", beginning->next->next->str);
printf("%sn", beginning->next->next->next->str);
并添加回文检查。