动态内存 C.



我的任务是创建程序,从文件中读取所有单词,并将从头到尾相同的单词放入输出文件中(我的意思是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);

并添加回文检查。

相关内容

  • 没有找到相关文章

最新更新