我的任务是创建一个程序,该程序从文件中读取所有单词,并将那些从头到尾都相同的单词放入输出文件中(我的意思是aha,oho,asdsa,assa等)。任务需要使用动态内存(大学),但是我已经在这里呆了好几天了,因为我找不到为什么它不想做我打算做的事情。我的档案有4个字。那4个printfs应该打印所有单词,但是我的程序会打印第三个单词,(空)和分段错误。我使用单面动态内存。
请解释为什么它不起作用,因为我自己做不到。先感谢您!
码:

/*
 * 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.\r\n");
                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("%s\r\n", element->str);
        printf("%s\r\n", element->next->str);
        printf("%s\r\n", element->next->next->str);
        printf("%s\r\n", element->next->next->next->str);

        fclose(in);
}

最佳答案

查看您的代码,好像您错过了循环的一步。您永远不会通过第二个单词,因为element永远不会更新。

代码段

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);


查看此page,它具有有关链接的lsits(这就是您正在使用的内容)的一些重要信息。

编辑1

我发现我编写的原始代码有错误。设置str的位置将覆盖原始元素的str值。该代码永远不会创建一个列表,该列表的长度不得超过1个元素,并且一个元素将始终在文件中包含最后一个单词,后跟一个null。

关于c - 动态内存C,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27042849/

10-13 06:48