C 从传递给函数的嵌套结构访问信息

C 从传递给函数的嵌套结构访问信息,c,struct,nested,C,Struct,Nested,我有以下代码: struct wordPair { char* englishWord; char* foreignWord; }; struct dictionary { struct wordPair ** data; int nbwords; int size; }; 假设我用一些数据填充了struct dictionary*dictionaryPtr,并将其传递给以下函数: char* dictionary_tra

我有以下代码:

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\u translate
中,如何从嵌套在传递的结构中的
struct wordPair
访问数据?我需要函数返回
englishWord
foreignWord
的标准值

我正在尝试
d->data->englishWord
,但这给了我一个错误“请求非结构或联合中的成员'englishWord'

更新

我需要函数
dictionary\u 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*translationPtr=NULL;
对于(i=0;i
这是我到目前为止的翻译函数

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;
}
char*dictionary\u translate(结构字典*d,
常量字符*常量英语单词,
常量字符*常量外来词){
int i;
如果(d==NULL)返回NULL;
对于(i=0;inbwords;i++){
if(strcmp(英语单词,d->data[i]->英语单词)==0)
返回strdup(d->data[i]->foreignWord);
else if(strcmp(外来字,d->data[i]->外来字)==0)
返回strdup(d->data[i]->englishWord);
}
返回NULL;
}
一旦程序进入翻译功能,它就会崩溃。我无法理解调试器找出发生了什么,但它似乎从来没有一个值不是NULL(0x0)。我是调试器新手,所以我相信如果我知道如何阅读它,它会告诉我更多

d->(*data)->englishWord

应该编译。

您的函数要做什么还不完全清楚,但最简单的可能正常工作的实现是:

#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\u translate()
的一个参数是空指针,必须修改函数中的代码,以避免在参数为空时取消引用该参数。这假定是双指针版本的
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;
}
char*dictionary\u translate(结构字典*d,
常量字符*常量英语单词,
常量字符*常量外来词)
{
对于(int i=0;inbwords;i++)
{
if(englishWord!=NULL&&strcmp(english_-word,d->data[i]->englishWord)==0)
返回strdup(d->data[i]->foreignWord);
else if(foreignWord!=NULL&&strcmp(foreignWord,d->data[i]->foreignWord)==0)
返回strdup(d->data[i]->englishWord);
}
返回0;
}

也许您需要取消对数据的引用,就像在d->(*data)->英语单词中一样,因为它看起来像是指向数组的指针。@DoctorZero:这在语法上是无效的C。我想您应该去咨询编译器,了解它对表达式可编译性的看法。我的观点(我承认我不是一个C编译器)是,它在语法上是不正确的。我只是想礼貌一点。您需要通过C编译器运行代码-它不会编译。如果你有一个C编译器在那里编译,请提供完整的细节。添加行
if(strcmp(d->(*data)->英语单词,“aleph”)==0)返回NULL导致Mac OS X 10.9.2上的GCC 4.8.2小牛说:
dict.c:在函数“dictionary\u translate”中:
dict.c:24:19:错误:在“(”token
at
if(strcmp(d->(*data)->englishWord,“aleph”)==0)
和插入符号
^
标记
of
(*data)
。一个有效的语法是
(*d->data)->英语单词
。它相当于
d->data[0]->英语单词
。感谢您的输入!我更新了我原来的问题。我实现了您建议的功能(讲师要求添加了几个附加功能),以及一些其他信息。现在运行时问题会崩溃,但是您在嵌套结构中访问信息的方法似乎非常有效!
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;
}