我已經完成了 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)
對不起,基本問題。我顯然在這里遺漏了一些東西,但我對我不理解的東西摸不著頭腦。
uj5u.com熱心網友回復:
我的問題是,為什么代表掃描單詞(w_scan)的變數必須初始化為字符而不是字串?
它沒有被初始化為char
. 它被初始化為的陣列,char
這正是包含字串的物件的型別。這讓我想到了第二個重點:資料型別char *
不代表字串。字串是一個或多個char
s 的序列,直到并包括一個值為 0 的終止符。型別物件char *
對于參考字串很有用,但不能與字串本身混淆。這屬于區分指標和它所指向的事物的范疇。
如果你改為寫
char *w_scan[LENGTH 1];
然后您因此宣告一個指標陣列,而不是char
. 在某些情況下,這可能正是您想要的,但這不是其中一種情況。
uj5u.com熱心網友回復:
在這份宣告中
char w_scan[LENGTH 1];
宣告了一個字符陣列,LENGTH 1
用于通過此呼叫在回圈中從檔案中讀取單詞
fscanf(d_pointer, "%s", w_scan)
本宣告
char * w_scan[LENGTH 1];
沒有意義。該函式讀取字符序列而不是指標序列。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/434335.html
下一篇:如何按Id更新嵌套陣列元素