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
数组。在某些情况下,这可能正是您想要的,但这不是其中一种情况。
我已经完成了 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
数组。在某些情况下,这可能正是您想要的,但这不是其中一种情况。