C 如何将包含键和值的数组声明为字符串,并且一个键可以有多个值?

C 如何将包含键和值的数组声明为字符串,并且一个键可以有多个值?,c,arrays,pointers,C,Arrays,Pointers,我正在练习一个C编程练习,要求编写一个模拟短消息服务(SMS)的程序。程序允许用户输入缩写字符串,如“IMO”,然后显示一些全文;例如,“在我看来”、“国际海事组织”和“纪念”。我正在考虑声明一个存储键和值的数组,但我不知道如何使一个键保存多个值。我还想硬编码的短信字典,键和值的数量,他们的长度是不固定的 我的程序中已经有这一行,但它不能满足我的期望 char *dictionary[10][2]; // this code can only keep 10 keys and 10 values

我正在练习一个C编程练习,要求编写一个模拟短消息服务(SMS)的程序。程序允许用户输入缩写字符串,如“IMO”,然后显示一些全文;例如,“在我看来”、“国际海事组织”和“纪念”。我正在考虑声明一个存储键和值的数组,但我不知道如何使一个键保存多个值。我还想硬编码的短信字典,键和值的数量,他们的长度是不固定的

我的程序中已经有这一行,但它不能满足我的期望

char *dictionary[10][2]; // this code can only keep 10 keys and 10 values, and the length is defined to 10 characters.

我不知道为什么该行包含
strcmp()
对于两个相等的字符串不返回0

#include <stdio.h>
#include <string.h>
#define DATAINPUTSIZE 180
#define STRUCTSIZE 10

struct TextStruct
{
    char * key;
    char * values;
    struct TextStruct *next;
};

typedef struct TextStruct TextStruct;

int main(void)
{
    size_t i;
    char *tokenPtr; // create char pointer
    char data_input[DATAINPUTSIZE];
    TextStruct sms1, sms2, sms3, sms4, sms5, sms6, sms7, sms8, sms9, sms10;
    TextStruct smsCases[] = 
    {
        {"AFAIK", "As far as I know", &sms1},
        {"AFK", "Away from keyboard", &sms2},
        {"LUV", "Love", &sms3},
        {"THX", "Thanks", &sms4},
        {"2day", "Today", &sms5},
        {"B4", "Before", &sms6},
        {"HAND", "Have a nice day", &sms7},
        {"CU", "See you", &sms8},
        {"SWYP?", "So what's your problem", &sms9},
        {"hh", "Haha", &sms10}
    };

    // Gets user's input
    puts("Enter a SMS (180 charaters exclusive): ");
    fgets(data_input,DATAINPUTSIZE,stdin);

    // Prints the string of data_input
    puts(data_input);

    // Tokenize the space characters; Compare each word if it is equal to keys (shortcut) of each struct
    // Tokenizing sentence
    tokenPtr = strtok(data_input, " ");

    // continue tokenizing sentence until tokenPtr becomes NULL
    while (tokenPtr != NULL)
    {
        //printf("%s\n", tokenPtr);
        for (i = 0; i < STRUCTSIZE; ++i)
        {
            if(strcmp(tokenPtr, smsCases[i].key) == 0)
            {
                puts(smsCases[i].values);
            }
        }
        tokenPtr = strtok(NULL, " "); // get next token
    }

    return 0;
}
#包括
#包括
#定义DATAINPUTSIZE 180
#定义结构大小10
结构文本结构
{
字符*键;
字符*值;
结构文本结构*下一步;
};
类型定义结构文本结构文本结构;
内部主(空)
{
尺寸i;
char*tokenPtr;//创建字符指针
字符数据输入[DATAINPUTSIZE];
TextStruct sms1、sms2、sms3、sms4、sms5、sms6、sms7、sms8、sms9、sms10;
TextStruct smsCases[]=
{
{“AFAIK”,“据我所知,&sms1},
{“AFK”、“远离键盘”、&sms2},
{“爱”、“爱”&sms3},
{“THX”、“谢谢”、&sms4},
{“2天”、“今天”和sms5},
{“B4”、“之前”、&sms6},
{“手”,“祝你今天愉快”&sms7},
{“CU”,“再见”&sms8},
{“SWYP?”,“你有什么问题”,&sms9},
{“hh”、“Haha”和sms10}
};
//获取用户的输入
puts(“输入短信(不含180个字符):”;
fgets(数据输入、数据输入大小、标准输入);
//打印输入的数据字符串
puts(数据输入);
//标记空格字符;比较每个单词是否等于每个结构的键(快捷键)
//标记句
tokenPtr=strtok(数据输入“”);
//继续标记化语句,直到tokenPtr变为NULL
while(tokenPtr!=NULL)
{
//printf(“%s\n”,tokenPtr);
对于(i=0;i
有几种方法可以做到这一点,但如果您迄今为止完成的代码是一种指示,那么这一练习目前超出了您的能力范围。您的数组应该是一个
struct
s数组,每个
struct
包含一个键和该键的翻译列表。列表可以有几种形式,但最简单的是指向
char
数组的指针数组。@CareyGregory我明白你的意思了。使用struct是个好主意。虽然我读过“struct”,但这个练习需要我练习指针、数组和字符串库。还有其他选择吗?使用结构数组并不意味着您不关注指针和数组。您需要的结构几乎肯定包含指针和数组。如果你陷入困境,我建议用一个结构数组再做一次尝试,然后再问一个更详细的问题。我能不能声明这样一个数组{{“omg”、“oh my gosh”、“oh my girl”}、{“luv”、“love”}、{“AFAIK”、“据我所知”}?@CareyGregory好的,我会用结构来做这个练习。我不想伤害自己,我解决了这个问题。因为数据输入数组在用户按键盘键后包含“\n”字符。因此,此数组的长度比没有“\n”字符的“key”字符串长。您就可以做到这一点了。您可能需要更改的一件事是将
values
元素设置为一个链表,这样您就可以对一个缩写有多个定义。除非你为每个缩写输入多个条目,否则你现在所拥有的并不能真正做到这一点。