C 如何将包含键和值的数组声明为字符串,并且一个键可以有多个值?
我正在练习一个C编程练习,要求编写一个模拟短消息服务(SMS)的程序。程序允许用户输入缩写字符串,如“IMO”,然后显示一些全文;例如,“在我看来”、“国际海事组织”和“纪念”。我正在考虑声明一个存储键和值的数组,但我不知道如何使一个键保存多个值。我还想硬编码的短信字典,键和值的数量,他们的长度是不固定的 我的程序中已经有这一行,但它不能满足我的期望C 如何将包含键和值的数组声明为字符串,并且一个键可以有多个值?,c,arrays,pointers,C,Arrays,Pointers,我正在练习一个C编程练习,要求编写一个模拟短消息服务(SMS)的程序。程序允许用户输入缩写字符串,如“IMO”,然后显示一些全文;例如,“在我看来”、“国际海事组织”和“纪念”。我正在考虑声明一个存储键和值的数组,但我不知道如何使一个键保存多个值。我还想硬编码的短信字典,键和值的数量,他们的长度是不固定的 我的程序中已经有这一行,但它不能满足我的期望 char *dictionary[10][2]; // this code can only keep 10 keys and 10 values
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
元素设置为一个链表,这样您就可以对一个缩写有多个定义。除非你为每个缩写输入多个条目,否则你现在所拥有的并不能真正做到这一点。