如何正确使用malloc和strtok?

时间:2017-04-20 14:19:03

标签: c malloc strtok

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define MAX_HEIGHT 5
#define MAX_WIDTH  9
#define MAX_DIRECT 30

typedef struct position_t position_t;

struct position_t {
        char *position;
        char *ptr;
};

int main(int argc, char *argv[])
{
        int i;
        FILE *fp;
        char a[50], b[50], c[50], d[50];
        position_t pos;

        pos.position = malloc(sizeof(char) * 20);

        for (i = 1; i < argc; i++) {
                fp = fopen(argv[i], "r");
                if (fp == NULL) {
                        fprintf(stderr, "cat: can't open %s\n", argv[i]);
                        continue;
                }

                fgets(a, 50, fp);
                fgets(b, 50, fp);
                fgets(c, 50, fp);
                fgets(d, 50, fp);

                fclose(fp);

                while (1) {
                        int j = 0;

                        pos.position = 0;
                        pos.ptr = strtok(a, ",.; ");

                        while (pos.ptr != NULL) {
                                pos.position[j] = *pos.ptr;
                                j++;
                                pos.ptr = strtok(NULL, ",.; ");
                        }

                        printf("%c", pos.position[j]);
                }

        }

        free(pos.position);
        return 0;
}

我想要做的是从文件中读取第一行(其内容是:START FOYER ELEVATOR)并通过strtok按空格分割,然后将每个字符串存储在malloc,pos.position和以后在我想要使用的地方使用它。有人可以修改这段代码吗?

1 个答案:

答案 0 :(得分:4)

使用

pos.position = (char*)malloc(sizeof(char)*20);

你分配20个字节的内存,并使pos.position指向那个内存。

但后来你做了

pos.position = 0;

使pos.position成为空指针。

当您丢失malloc返回的指针时,指针的重置将导致内存泄漏,并且当您使用例如取消引用指针时,它也将导致未定义的行为pos.position[j]

此外,当您在内部while循环后执行

printf("%c", pos.position[j]);

打印尚未初始化的内存元素。

要使当前代码有效,请不要在循环中重置指针。在内部while循环之后添加终结符。并将数组打印为字符串。哦,并添加一个条件,这样你就不会写出超出已分配内存的范围。

实际上,由于你总是分配一定数量的内存,我建议你不要动态分配内存。而是将pos.position设为数组