我有以下代码:
struct wordPair {
char* englishWord;
char* foreignWord;
};
struct dictionary {
struct wordPair ** data;
int nbwords;
int size;
};
假设我struct dictionary *dictionaryPtr
填充了一些数据,并将其传递给以下函数:
char* dictionary_translate( struct dictionary* d,
const char* const english_word,
const char* const foreign_word)
在函数dictionary_translate
中,如何从嵌套在传递结构中的struct wordPair
访问数据?我需要函数来返回englishWord
或foreignWord
的结果。
我正在尝试d->data->englishWord
,但这给了我错误“请求成员'englishWord',而不是结构或联合”。
UPDATE!
我需要函数dictionary_translate
来确定是否存在包含传递给它的一个单词的匹配单词对,并返回翻译的strdup
(另一个单词这对)。这是我定义的单词数组:
const char* test_translations[NB_TESTS][NB_COLS] =
{
{"hello", "hola"},
{"cat", "gato"},
{"dog", "perro"},
{"thanks", "gracias"},
{"pants", "pantalones"},
{"shoes", "zapatos"},
};
这就是我正在尝试的第一个测试中调用函数的方式,也就是当translate函数传递一个英文单词并且需要返回一个外来单词时:
char* translationPtr = NULL;
for (i = 0; i < NB_TESTS; i++) {
translationPtr = dictionary_translate(dictionaryPtr, test_translations[i][0], NULL);
printf("English Word %s translated: %s\n", test_translations[i][0], translationPtr);
}
这是我迄今为止的翻译功能......
char* dictionary_translate( struct dictionary* d,
const char* const english_word,
const char* const foreign_word){
int i;
if (d == NULL) return NULL;
for (i = 0; i < d->nbwords; i++) {
if (strcmp(english_word, d->data[i]->englishWord) == 0)
return strdup(d->data[i]->foreignWord);
else if (strcmp(foreign_word, d->data[i]->foreignWord) == 0)
return strdup(d->data[i]->englishWord);
}
return NULL;
}
一旦程序进入翻译功能,它就会崩溃。我无法理解调试器以找出发生了什么,但似乎translationPtr
永远不会有NULL(0x0)以外的值。我是调试器的新手,所以我相信如果我知道如何阅读它,它可以告诉我更多。
答案 0 :(得分:0)
并不完全清楚你的功能是做什么的,但关于可能合法工作的最简单的实现是:
#include <string.h>
struct wordPair
{
char *englishWord;
char *foreignWord;
};
struct dictionary
{
struct wordPair **data;
int nbwords;
int size;
};
extern char *dictionary_translate(struct dictionary *d,
const char *const english_word,
const char *const foreign_word);
char *dictionary_translate(struct dictionary *d,
const char *const english_word,
const char *const foreign_word)
{
for (int i = 0; i < d->nbwords; i++)
{
if (strcmp(english_word, d->data[i]->englishWord) == 0)
return strdup(d->data[i]->foreignWord);
else if (strcmp(foreign_word, d->data[i]->foreignWord) == 0)
return strdup(d->data[i]->englishWord);
}
return 0;
}
我认为您应该检查struct dictionary
的设计。使用双指针似乎是不必要的(或者使用它的原因并不明显)。唯一的好处是你有一个连续的struct wordPair
指针数组,而实际的struct wordPair
元素不需要连续分配。下面的代码是一个更正统的定义,假设struct wordPair
的连续数组不是问题:
#include <string.h>
struct wordPair
{
char *englishWord;
char *foreignWord;
};
struct dictionary
{
struct wordPair *data;
int nbwords;
int size;
};
extern char *dictionary_translate(struct dictionary *d,
const char *const english_word,
const char *const foreign_word);
char *dictionary_translate(struct dictionary *d,
const char *const english_word,
const char *const foreign_word)
{
for (int i = 0; i < d->nbwords; i++)
{
if (strcmp(english_word, d->data[i].englishWord) == 0)
return strdup(d->data[i].foreignWord);
else if (strcmp(foreign_word, d->data[i].foreignWord) == 0)
return strdup(d->data[i].englishWord);
}
return 0;
}
给定样本测试代码,其中dictionary_translate()
的一个参数是一个NULL指针,必须修改函数中的代码,如果它为null,则不要取消引用该参数。这假设是struct dictionary
的双指针版本。
char *dictionary_translate(struct dictionary *d,
const char *const english_word,
const char *const foreign_word)
{
for (int i = 0; i < d->nbwords; i++)
{
if (englishWord != NULL && strcmp(english_word, d->data[i]->englishWord) == 0)
return strdup(d->data[i]->foreignWord);
else if (foreignWord != NULL && strcmp(foreign_word, d->data[i]->foreignWord) == 0)
return strdup(d->data[i]->englishWord);
}
return 0;
}
答案 1 :(得分:-3)
d->(*data)->englishWord
应该编译。