【发布时间】:2020-04-19 16:16:12
【问题描述】:
我使用 strtok() 来拆分字符串并存储在数组中,如下所示
char *table[5];
char buffer[50] = {"1-Study"}; // The value is example, get new value by user
char *number;
char *name;
uint8_t tableNumber;
number = strtok(buffer, "-"); //equals "1"
name = strtok(NULL, "-"); //equals "Study"
tableNumber = atoi(number); //convert char to int
table[tableNumber] = name;
for (c = 0; c < 5; c++)
{
printf("table %d = %s\n", c, table[c]);
}
输入5次后,结果应该是:
table 0 = Study
table 1 = Sleep
table 2 = Party
table 3 = Hello
table 4 = Exit
但结果是:
table 0 = Exit
table 1 = Exit
table 2 = Exit
table 3 = Exit
table 4 = Exit
有什么问题?
请帮帮我?
谢谢
完整代码:
char gMessageBuffer[40];
char *gSceneTable[13];
boolean emberAfPreMessageReceivedCallback(EmberAfIncomingMessage* incomingMessage)
{
if (incomingMessage->apsFrame->profileId == HA_PROFILE_ID)
{
if (incomingMessage->apsFrame->clusterId == ZCL_SCENES_CLUSTER_ID)
{
MEMCOPY(gMessageBuffer, incomingMessage->message, incomingMessage->msgLen); // Get incoming message
gMessageBuffer[incomingMessage->msgLen] = '\0';
emberEventControlSetDelayMS(getScenePayloadEventControl, SCENE_ACTION_TRESH);
return true;
}
}
return false;
}
void getScenePayloadEventFunction(void)
{
char *sceneNumber;
char *sceneName;
char *sceneID;
char *sceneAction;
uint8_t sceneTableNumber;
emberAfCorePrintln("///Incoming Message: %s///", gMessageBuffer);
sceneNumber = strtok(gMessageBuffer, ".");
sceneName = strtok(NULL, ".");
sceneID = strtok(NULL, ".");
sceneAction = strtok(NULL, ".");
emberAfCorePrintln("///SCENE NUMBER: %s///", sceneNumber);
emberAfCorePrintln("///SCENE NAME: %s///", sceneName);
emberAfCorePrintln("///SCENE ID: %s///", sceneID);
emberAfCorePrintln("///SCENE ACTION: %s///", sceneAction);
if (strcmp(sceneAction, "Update") == 0)
{
sceneTableNumber = atoi(sceneNumber);
gSceneTable[sceneTableNumber] = strdup(sceneName);
}
emberEventControlSetInactive(getScenePayloadEventControl);
}
这适用于简单工作室 IDE 中的微控制器。
我在 emberAfPreMessageReceivedCallback 中正确获取了有效负载 我把它分成 4 个部分并正确打印。
但是在将 sceneName 复制到 gSceneTable 数组后,我看到 gSceneTable[sceneTableNumber] = sceneName 的 gSceneTable 的所有元素中的最后一个 sceneName,我看到 gSceneTable[sceneTableNumber] = strdup(sceneName); 的“p]”;
【问题讨论】:
-
您能提供一个完整的(可编译的)最小示例吗?
-
char buffer[50] = {"1-Study"};-->char buffer[50] = "1-Study"; -
@David Ranieri:这是更常见的做法,但两者是等价的
-
@xanoetux,是的,这不是问题,但在单个数组中看到多维符号有点奇怪。