Fscanf不能复制到字符串

时间:2017-08-08 12:13:24

标签: c string scanf

你知道你尝试学习的那一刻,但是你错过了一些小细节,却无法弄清楚吗?我有其中一个,如果它结束了将非常感激。无论如何,这是我的代码:

//我试图为trie实现加载函数,特别是字典

//当我到达strcpy时遇到段错误,但当我检查' word'的值时那里,它是空的

bool load(const char *dictionary) {
    FILE *file = fopen(dictionary, "r");
    char *word = NULL;
    char input[45] = { '\0' };
    int size = sizeof(node);

    while (fscanf(file, "%s", word) != EOF) {
        printf("%s", word);
        strcpy(input, word);
        int cycle = 0;
        node *next = &root;

        while (input[cycle] != '\0') {
            int position = toupper(input[cycle]) % 65;
            if (position == 39) {
                position = 26;
            }

            if (next->children[position] == NULL) {
                next->children[position] = malloc(size);
                next = next->children[position];
            } else {
                next = next->children[position];
            }
        }

        *sizePointer = *sizePointer + 1;
        next->wordHere = true;
    }
    fclose(file);
    return true;
}

2 个答案:

答案 0 :(得分:0)

使用fscanf时,需要确保为要写入的参数分配足够的内存。

例如,你可以按如下方式声明“word”:

char word[100];

这允许最多100个字符的字符串(包括终止空字符)。您提交的代码没有分配任何空间,并且您正在遇到未定义的行为。很可能fscanf会覆盖你的“输入”变量,但它实际上取决于编译器以及启用了哪些编译设置。

我建议你完全忘记变量“word”并将“输入”传递给你的fscanf。然后你也可以删除对strcpy的调用。

此外,fscanf是一种在使用时需要非常小心的功能。请在SO上查看此问题:When/why is it a bad idea to use the fscanf() function?

答案 1 :(得分:0)

您必须将word定义为数组或指向实际数组的指针。将NULL作为%s转换说明符的目标传递具有未定义的行为。

此外,您应该传递要存储到阵列中的最大字节数,以防止潜在的缓冲区溢出。

最后,对返回值的测试应该是== 1而不是!= EOF。在这种特殊情况下,行为将大致相同,但一般情况下不会。

以下是修改后的版本:

bool load(const char *dictionary) {
    FILE *file = fopen(dictionary, "r");
    char word[45];
    char input[45] = { '\0' };
    int size = sizeof(node);

    if (file == NULL)
        return false;

    while (fscanf(file, "%44s", word) == 1) {
        printf("%s\n", word);
        strcpy(input, word);
        ...