CS50 Pset 5(拼写):将变量初始化为 char 还是 char*?

CS50 Pset 5 (speller): Initialization of variable as char or char*?

我已经完成了 CS50 PS5(拼写)。除了加载函数中的一行代码外,我了解该程序。语法看似微不足道,但我想了解发生了什么。

bool load(const char *dictionary)
{
    // Open dictionary
    FILE *d_pointer = fopen(dictionary, "r");
    if (d_pointer == NULL)
    {
        printf("Unable to open %s\n.", dictionary);
        return false;
    }

    // Variable for scanned words
    char w_scan[LENGTH + 1];

    // Scan words from dictionary
    while (fscanf(d_pointer, "%s", w_scan) != EOF)
    {

        // Create new node
        node *n = malloc(sizeof(node));
        if (n == NULL)
        {
            return false;
        }

        // Copy word into node
        strcpy(n->word, w_scan);

        // Hash word
        int h_value = hash(w_scan);

        // Insert node into hash table
        n->next = table[h_value];
        table[h_value] = n;
        d_size++;
    }

    // Close dictionary
    fclose(d_pointer);

    return true;
}

我的问题是,为什么表示扫描单词的变量 (w_scan) 必须初始化为字符而不是字符串?如果我将 w_scan 的初始化替换为 char *w_scan 而不是 char w_scan 我会收到以下错误:

dictionary.c:83:36: error: format specifies type 'char *' but the argument has type 'char **' [-Werror,-Wformat] while (fscanf(d_pointer, "%s", w_scan) != EOF)

抱歉这个基本问题。我显然在这里遗漏了一些东西,但我对我不理解的东西感到困惑。

在此声明中

char w_scan[LENGTH + 1];

声明了一个 LENGTH + 1 个字符的数组,用于通过此调用循环从文件中读取单词

fscanf(d_pointer, "%s", w_scan)

这个声明

char * w_scan[LENGTH + 1];

没有意义。该函数读取字符序列而不是指针序列。

My questions is, why does the variable that represents scanned words (w_scan) have to be initialized as a char and not a string?

它没有被初始化为 char。它被初始化为一个数组 of char,这正是保存字符串的对象类型。这让我想到了第二个要点:数据类型 char * 不代表字符串 。字符串是一个或多个 char 的序列,直到并包括值为 0 的终止符。类型 char * 的对象对于引用字符串很有用,但不能将它们与字符串混淆他们自己。这属于区分指针和它所指向的事物的范畴。

如果你改写

    char *w_scan[LENGTH + 1];

然后你声明了一个指针数组,而不是char数组。在某些情况下,这可能正是您想要的,但这不是其中一种情况。