繁体   English   中英

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

[英]Accessing information from nested struct passed to function

我有以下代码:

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中的struct wordPair中访问数据? 我需要该函数返回englishWordforeignWord的strdup。

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

更新!

我需要的dictionary_translate函数要做的是确定是否有一个匹配的单词对,其中包含传递给它的单词中的一个,然后返回翻译的strdup (该对中的另一个单词)。 这是我定义的单词数组:

const char* test_translations[NB_TESTS][NB_COLS] =
{
    {"hello", "hola"},
    {"cat", "gato"},
    {"dog", "perro"},
    {"thanks", "gracias"},
    {"pants", "pantalones"},
    {"shoes", "zapatos"},
};

这是我在尝试的第一个测试中调用函数的方式,这是当translation函数传递英语单词并要求返回外来单词时:

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)以外的值。 我是调试器的新手,所以我确信,如果我知道如何阅读它,它可以告诉我更多信息。

尚不完全清楚您的函数将要执行的操作,但是可能合法工作的最简单的实现是:

#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元素本身不需要连续分配。 假定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指针,则必须修改函数中的代码,以免在引用为空时取消引用该参数。 假设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;
}
d->(*data)->englishWord

应该编译。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM