将分割后的字符串存储在数组中

马吉德

我使用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);
}   

这是针对Simple Studio IDE中的微控制器的。

我在emberAfPreMessageReceivedCallback中正确获得了有效载荷,并将其分成4部分并正确打印。

但是在将sceneName复制到gSceneTable数组后,我看到gSceneTable的所有元素中的最后一个sceneName带有gSceneTable [sceneTableNumber] = sceneName,我看到了“ p]”,其中gSceneTable [sceneTableNumber] = strdup(sceneName);

chqrlie

您的程序极不可能产生发布的输出。该代码段只处理一个字符串和char *table[5];未初始化,所以打印从琴弦table[0]table[2]table[3]table[4]具有不确定的行为。您已指定从文件中读取字符串,需要发布完整的程序才能进行精确而正确的分析。如果文件没有覆盖所有条目,则不初始化数组是一个问题,将无法分辨出哪些设置了,哪些没有设置。

假设您的程序从文件或标准输入中读取字符串,使用进行解析,则strtok返回指向源字符串的指针,该字符串是您从文件中读取行的数组。因此,table[]数组中的所有条目都指向数组中的同一字节,这解释了您得到的输出:最后一行内容的5倍。

您应该复制存储在表中的字符串:

table[tableNumber] = strdup(name);

这是一个完整且经过修改的程序:

#include <stdio.h>
#include <string.h>

int main() {
    char *table[5] = { NULL, NULL, NULL, NULL, NULL };
    char buffer[50];
    char *number;
    char *name;
    int tableNumber;

    for (int i = 0; i < 5; i++) {
        if (!fgets(buffer, sizeof buffer, stdin))
            break;
        number = strtok(buffer, "-");
        if (number == NULL) {
            printf("empty line\n");
            continue;
        }
        name = strtok(NULL, "-\n");
        if (name == NULL) {
            printf("no name after -\n");
            continue;
        }
        tableNumber = atoi(number);
        if (tableNumber < 0 || tableNumber >= 5) {
            printf("invalid number: %d\n", tableNumber);
            continue;
        }
        table[tableNumber] = strdup(name);
    }

    for (int i = 0; i < 5; i++) {
        if (table[i])
            printf("table %d = %s\n", i, table[i]);
    }

    for (int i = 0; i < 5; i++) {
        free(table[i]);
    }
    return 0;
}

如果您的目标系统不支持strdup(),请使用此命令:

#include <stdlib.h>
#include <string.h>

char *mystrdup(const char *s) {
    size_t size = strlen(s) + 1;
    char *p = malloc(size);
    return (p != NULL) ? memcpy(p, s, size) : NULL;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将字符串存储在数组中

来自分类Dev

将字符串存储在数组中并拆分字符串

来自分类Dev

将逗号添加到存储在数组中的一组字符串中

来自分类Dev

使用循环将存储在数组中的字符串放在特定文件的特定行中

来自分类Dev

如何将字节存储在数组中并获取字符串

来自分类Dev

使用malloc()和realloc()将字符串存储在数组中

来自分类Dev

选择自己的冒险:将播放器字符串存储在数组中

来自分类Dev

PHP:将字符串存储在数组中以及它被添加了多少次?

来自分类Dev

将字符串拆分并存储在数组 php 中

来自分类Dev

将文件的每一行作为字符串存储在数组中

来自分类Dev

在数据库中存储字符串数组

来自分类Dev

PHP获取单独的字符串以存储在数组中

来自分类Dev

分割字符串后在Javascript函数中返回数组

来自分类Dev

分割字符串后在Javascript函数中返回数组

来自分类Dev

使用awk将拆分后的字符串存储到数组中

来自分类Dev

Java-将字节数组作为字符串存储在数据库中,并使用字符串值创建字节数组

来自分类Dev

将数组存储在字符串中作为数组

来自分类Dev

将字符串存储到C中的数组中

来自分类Dev

如何用“#”分割字符串并将结果存储在数据表中

来自分类Dev

如何用“#”分割字符串并将结果存储在数据表中

来自分类Dev

如何检查字符串是否包含存储在数组中的字符,但是如果字符串包含不在数组中的任何字符,则返回false

来自分类Dev

将字符串文件存储到动态数组中

来自分类Dev

将标头存储在字符串数组VBA中

来自分类Dev

将字符串循环存储到数组中?

来自分类Dev

C将字符串存储到数组中

来自分类Dev

Java,将字符串存储到数组中

来自分类Dev

将字符串数组存储到数据属性中

来自分类Dev

将字符串分割成字符串数组

来自分类Dev

将字符串分割成字符串数组

Related 相关文章

  1. 1

    将字符串存储在数组中

  2. 2

    将字符串存储在数组中并拆分字符串

  3. 3

    将逗号添加到存储在数组中的一组字符串中

  4. 4

    使用循环将存储在数组中的字符串放在特定文件的特定行中

  5. 5

    如何将字节存储在数组中并获取字符串

  6. 6

    使用malloc()和realloc()将字符串存储在数组中

  7. 7

    选择自己的冒险:将播放器字符串存储在数组中

  8. 8

    PHP:将字符串存储在数组中以及它被添加了多少次?

  9. 9

    将字符串拆分并存储在数组 php 中

  10. 10

    将文件的每一行作为字符串存储在数组中

  11. 11

    在数据库中存储字符串数组

  12. 12

    PHP获取单独的字符串以存储在数组中

  13. 13

    分割字符串后在Javascript函数中返回数组

  14. 14

    分割字符串后在Javascript函数中返回数组

  15. 15

    使用awk将拆分后的字符串存储到数组中

  16. 16

    Java-将字节数组作为字符串存储在数据库中,并使用字符串值创建字节数组

  17. 17

    将数组存储在字符串中作为数组

  18. 18

    将字符串存储到C中的数组中

  19. 19

    如何用“#”分割字符串并将结果存储在数据表中

  20. 20

    如何用“#”分割字符串并将结果存储在数据表中

  21. 21

    如何检查字符串是否包含存储在数组中的字符,但是如果字符串包含不在数组中的任何字符,则返回false

  22. 22

    将字符串文件存储到动态数组中

  23. 23

    将标头存储在字符串数组VBA中

  24. 24

    将字符串循环存储到数组中?

  25. 25

    C将字符串存储到数组中

  26. 26

    Java,将字符串存储到数组中

  27. 27

    将字符串数组存储到数据属性中

  28. 28

    将字符串分割成字符串数组

  29. 29

    将字符串分割成字符串数组

热门标签

归档